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

0 投票
1 回答
823 浏览
提问于 2025-04-16 16:00

在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()

撰写回答