Разделение замка между рабочими оружейных
Есть ли хороший способ разделить многопроцессорную блокировку между рабочими-оружейниками? Я пытаюсь написать json API с Flask. Некоторые вызовы API взаимодействуют с классом python, который управляет запущенным процессом (например, ffmpeg для преобразования видео). Когда я увеличу число веб-работников до более чем 1, как я могу гарантировать, что только один работник одновременно взаимодействует с классом?
Сначала я хотел использовать multiprocessing.Lock, чтобы функция start () могла быть атомарной. Я не думаю, что я нашел правильное место для создания Замка, чтобы он был общим для всех работников:
# runserver.py
from flask import Flask
from werkzeug.contrib.fixers import ProxyFix
import dummy
app = Flask(__name__)
@app.route('/')
def hello():
dummy.start()
return "ffmpeg started"
app.wsgi_app = ProxyFix(app.wsgi_app)
if __name__ == '__main__':
app.run()
Вот моя фиктивная операция:
# dummy.py
from multiprocessing import Lock
import time
lock = Lock()
def start():
lock.acquire()
# TODO do work
for i in range(0,10):
print "did work %s" % i
time.sleep(1)
lock.release()
Когда я обновляю страницу несколько раз, я вижу результаты каждого вызова, сплетенного вместе.
Я лаю не на том дереве? Есть ли более простой способ убедиться, что одновременно запускается только копия класса обработки (здесь только фиктивный метод start ())? Я думаю, что мне может понадобиться что-то вроде сельдерея для выполнения задач (и просто использовать только 1 работника), но это кажется немного излишним для моего небольшого проекта.