Basic inter-process locks
The zc.lockfile package provides a basic portable implementation of interprocess locks using lock files. The purpose if not specifically to lock files, but to simply provide locks with an implementation based on file-locking primitives. Of course, these locks could be used to mediate access to other files. For example, the ZODB file storage implementation uses file locks to mediate access to file-storage database files. The database files and lock file files are separate files.
Lock file support
The ZODB lock_file module provides support for creating file system locks. These are locks that are implemented with lock files and OS-provided locking facilities. To create a lock, instantiate a LockFile object with a file name:
>>> import zc.lockfile >>> lock = zc.lockfile.LockFile('lock')
If we try to lock the same name, we’ll get a lock error:
>>> import zope.testing.loggingsupport >>> handler = zope.testing.loggingsupport.InstalledHandler('zc.lockfile') >>> try: ... zc.lockfile.LockFile('lock') ... except zc.lockfile.LockError: ... print "Can't lock file" Can't lock file>>> for record in handler.records: # doctest: +ELLIPSIS ... print record.levelname, record.getMessage() ERROR Error locking file lock; pid=...
To release the lock, use it’s close method:
The lock file is not removed. It is left behind:
>>> import os >>> os.path.exists('lock') True
Of course, now that we’ve released the lock, we can create it again:
>>> lock = zc.lockfile.LockFile('lock') >>> lock.close()
Fixed: when there was lock contention, the pid in the lock file was lost.
Thanks to Daniel Moisset reporting the problem and providing a fix with tests.
Added test extra to declare test dependency on zope.testing.
Using Python’s doctest module instead of depreacted zope.testing.doctest.
- Fixed a small bug in error logging.