使用mod_wsgi时,如何控制对共享资源的访问?

时间:2011-04-19 02:08:12

标签: python synchronization mod-wsgi multiprocessing

在mod_wsgi中,Web请求可以由不同进程中的python解释器处理。我有一个共享资源,需要同步访问。 (此资源不是数据库。)

Python的多处理具有许多良好的同步原语,但似乎都依赖于在产生时共享的原语。由于这些过程是由mod_wsgi创建的,所以我无法控制它们的产生。

对共享资源使用互斥量等最简单的方法是什么?

1 个答案:

答案 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()