如何在使用mod_wsgi时控制对共享资源的访问?
在mod_wsgi中,网页请求可能会由不同进程中的Python解释器来处理。我有一个共享的资源,需要对它的访问进行同步。(这个资源不是数据库。)
Python的多进程功能有很多很好的同步工具,但这些工具似乎都依赖于在进程创建时就能共享这些工具。因为这些进程是由mod_wsgi创建的,所以我无法控制它们的创建过程。
那么,使用类似互斥锁的东西来管理这个共享资源的最简单方法是什么呢?
1 个回答
3
有几个选择,比如 posix_ipc 和使用 文件锁。我对这些解决方案不是很满意,因为我觉得应该有一个内置的 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()