Как я могу контролировать доступ к общему ресурсу при использовании mod_wsgi? - PullRequest
0 голосов
/ 19 апреля 2011

В mod_wsgi веб-запросы могут обрабатываться интерпретаторами python в разных процессах.У меня есть общий ресурс, доступ к которому нужно синхронизировать.(Этот ресурс не является базой данных.)

Многопроцессорная обработка Python имеет много хороших примитивов синхронизации, но, похоже, все они полагаются на примитивы, которые используются совместно во время появления.Поскольку процессы создаются mod_wsgi, я не могу контролировать их порождение.

Какой самый простой способ использовать что-то вроде мьютекса для общего ресурса?

1 Ответ

3 голосов
/ 19 апреля 2011

Пара вариантов: 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()
...