通过对文件加锁来实现应用级别的锁机制是session处理中很重要的一环。当然并不是所有的session模块都使用这种方式,而且在涉及到集群时还是存在问题。不过在通常情况下的确够用了。那么在beaker中有文件加锁的功能,但是在windows下它是不支持的。于是我在网上搜了一下,发现了一些结果。
http://pypi.python.org/pypi/lockfile 这是一个跨平台的锁机制。不过,它没有使用通常的fcntl模块,而是在Linux下通过符号链接,在windows下通过mkdir。这里有它的0.3版本的文档:
http://packages.python.org/lockfile/lockfile.html
通过它,我又找到了其它的几个锁模块:
Twisted http://twistedmatrix.com/trac/browser/trunk/twisted/python/lockfile.py 在windows下没有使用msvcrt.locking。
zc.lockfile http://pypi.python.org/pypi/zc.lockfile 它使用了msvcrt.locking,但是在Linux下不支持共享和排它锁的功能。
在Linux下,可以设置共享锁和排它锁,和数据库的锁机制有些象。如果一个文件加上了共享锁,则下一个进程如果也使用共享锁是允许的,但是如果使用了排它锁则不允许。如果一个文件加上了排它锁,下一个进程无论是使用共享锁还是排它锁都是被禁止的。但是在windows下,如果使用msvcrt.locking则并不区分,可以认为只是排它锁。
而zc.lockfile则功能不是很完整。在beaker中,之所以存在read_lock和write_lock就是充分利用了共享锁和排它锁。
于是我根据msvcrt.locking找到了这么一个地址: http://www.gnome.org/~jdub/bzr/planet/2.0/planet/htmltmpl.py
它是htmltmpl项目的文件,其中也有lockfile的实现,在windows下,它使用msvcrt模块,在linux下支持共享和排它锁。