在mod_wsgi中,Web请求可以由不同进程中的python解释器处理。我有一个共享资源,需要同步访问。 (此资源不是数据库。)
Python的多处理具有许多良好的同步原语,但似乎都依赖于在产生时共享的原语。由于这些过程是由mod_wsgi创建的,所以我无法控制它们的产生。
对共享资源使用互斥量等最简单的方法是什么?
答案 0 :(得分:3)
有两个选项posix_ipc并使用file locks。我对这些解决方案并不感到兴奋,因为似乎应该有一个内置的mod_wsgi或python库方法来交叉处理(不共享一个共同的父进程)同步。
这是一个文件锁定实现:
from contextlib import contextmanager
import fcntl
@contextmanager
def file_locked(filename, exclusive=True):
lockfile = open(filename, 'w')
if exclusive:
fcntl.flock(lockfile, fcntl.LOCK_EX)
else:
fcntl.flock(lockfile, fcntl.LOCK_SH)
yield
fcntl.flock(lockfile, fcntl.LOCK_UN)
if __name__ == '__main__':
from time import sleep
from random import random
from os import getpid
while True:
print '%d waiting for lock' % getpid()
with file_locked('filelock.lck'):
print '%d got the lock'% getpid()
sleep(random())
print '%d released the lock\n' % getpid()