有没有在gunicorn工作人员之间共享多处理锁的好方法?我正在尝试使用 Flask 编写 json API。一些 API 调用将与管理正在运行的进程的 python 类交互(例如用于视频转换的 ffmpeg)。当我将 Web Worker 的数量扩大到超过 1 个时,如何确保只有 1 个 Worker 同时与类交互?
我最初的想法是使用 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 个工作人员),但这对于我的小项目来说似乎有点大材小用。
我尝试了一些东西,它似乎有效。我放preload_app = True
in my gunicorn.conf
现在锁似乎是共享的。我仍在研究这里到底发生了什么,但现在这已经足够好了,YMMV。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)