有没有一种在 gunicorn 工人之间共享多进程锁的好方法?我正在尝试用 Flask 编写一个 json API。一些 API 调用将与管理正在运行的进程的 python 类交互(如用于视频转换的 ffmpeg)。当我将网络工作者的数量增加到 1 个以上时,如何确保只有 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() 方法)同时运行?我想我可能需要像 celery 这样的东西来运行任务(并且只使用 1 个工人),但这对于我的小项目来说似乎有点矫枉过正。