ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python – 在gunicorn工作者之间共享锁定

2019-09-29 16:58:03  阅读:203  来源: 互联网

标签:python concurrency flask multiprocessing gunicorn


有没有一个很好的方法来分享gunicorn工人之间的多处理锁?我正在尝试用Flask编写一个json API.一些API调用将与管理正在运行的进程的python类进行交互(如用于视频转换的ffmpeg).当我将Web工作者的数量扩大到1以上时,如何确保只有1名工作人员同时与该班级进行交互?

我最初的想法是使用multiprocessing.Lock,所以start()函数可以是原子的.我不认为我已经找到了创建Lock的正确位置,以便在所有工作者之间共享一个:

# 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个工人),但这对我的小项目来说似乎有些过分.

解决方法:

我试了一下,似乎工作了.我在我的gunicorn.conf中放了preload_app = True,现在锁似乎是共享的.我仍在调查这里到底发生了什么,但现在这已经足够了,YMMV.

标签:python,concurrency,flask,multiprocessing,gunicorn
来源: https://codeday.me/bug/20190929/1832304.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有