def __init__( self, identifier = None, #name under which the cache file is stored. defaults to modulename.objname environment = None, #object containing information regarding the dependencies on global state of the cached operation operation = None, #function to be cached. note that the order of arguments is significant for key reuse hierarchy = None, #key hierarchy; if and how args and kwargs are hierarchically ordered validate = False, #validation mode. if enabled, all cache retrievals are checked against a recomputed function call. deferred_timeout = 30, #time to wait before a deferred object is considered obsolete. compilation may take a long time; that said, it may also crash your process... lock_timeout = 1, #time to wait before a lock is considered obsolete. the lock is needed for pure db transactions only; this makes once second a long time environment_clear = True, #clear the cache upon connection with a novel environment key connect_clear = False #clear the cache upon every connection ): """ if environment_clear is set to true, the cache is cleared """ if identifier: self.identifier = identifier if operation: self.operation = operation self.hierarchy = hierarchy #add some essentials to the environment import platform globalenv = platform.architecture(), platform.python_version() funcenv = inspect.getargspec(self.operation), inspect.getsource(self.operation) self.environment = globalenv, funcenv, (environment if environment else self.environment()) estr, ehash = process_key(self.environment) self.validate = validate self.lock_timeout = lock_timeout self.deferred_timeout = deferred_timeout self.filename = os.path.join(cachepath, self.identifier) self.shelve = Shelve(self.filename, autocommit = True) self.lock = threading.Lock() self.lock_file = lockfile.MkdirLockFile(self.filename, timeout = lock_timeout) with self.lock, self.lock_file: if connect_clear: #this isnt right; we are now invalidating the precomputed envrowid of other processes... self.shelve.clear() #need write lock here #write environment key to database and obtain its unique rowid try: self.envrowid = self.shelve.getrowid(self.environment, estr, ehash) except: #connect to the db with a novel environment; probably wont change back again if environment_clear: self.shelve.clear() #need write lock here self.shelve.setitem(self.environment, None, estr, ehash) self.envrowid = self.shelve.getrowid(self.environment, estr, ehash)
def __init__(self, path): self.path = path self.lock = mkdirlockfile.MkdirLockFile(self.path, threaded=True)