【问题标题】:Flask / UWSGI architecture with worker thread带有工作线程的 Flask / UWSGI 架构
【发布时间】:2020-07-08 19:28:14
【问题描述】:

以下代码近似于真实代码。 Flask 应用程序启动时会创建一个工作线程。路由函数使用worker函数完成的数据处理。

app = Flask(__name__)

timeStr=""

def loop ():
        global timeStr
        while  True:
                time.sleep (2)
                timeStr =datetime.now().replace(microsecond=0).isoformat()
                print (timeStr)


ThreadID = Thread (target=loop)
ThreadID.daemon = True
ThreadID.start()

@app.route('/')
def test():
    return   os.name + " " + platform.platform() + " " + timeStr

application=app

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=8080, debug=True)

上面的应用程序在开始时运行良好,就像这样:

python3 app.py 

但是在 uwsgi 中,即使我启用了线程,应用程序也无法运行。它没有更新全球 timeStr

sudo /usr/local/bin/uwsgi --wsgi-file /home/pi/pyTest/app.py   --http :80 --touch-reload /home/pi/pyTest/app.py  --enable-threads --stats 127.0.0.1:9191

我需要做什么才能让应用在 UWSGI 下正常运行,这样我才能以正确的方式创建 systemd 服务?

【问题讨论】:

  • 您看到(或未看到)什么表明 timeStr 没有得到更新?
  • @DaveW.Smith - timeStr 始终为空,意味着它没有从初始“”值更新

标签: flask uwsgi debian-based


【解决方案1】:

坏消息,好消息。

我有一个应用程序以几乎相同的方式启动工作线程。它使用queue.Queue 让路由在工作线程上传递工作。该应用程序使用 Flask 开发服务器在我的家庭 Intranet(在 Rapsberry Pi 上)上运行良好。我尝试将我的应用程序放在uwsgi 后面,并观察到同样的失败——工作线程似乎没有被安排。该线程报告为_is_alive = True,但我找不到让它实际运行的uwsgi 开关组合。

使用gunicorn 解决了这个问题。

virtualenv venv --python=python3
. venv/bin/activate
pip install flask gunicorn
gunicorn -b 0.0.0.0:5000 demo:app

足以让我的应用运行(意味着工作线程实际运行,并且副作用很明显)。

【讨论】:

  • 感谢您的建议。我确实尝试过 Gunicorn。但是我遇到了超时问题(如果您搜索“gunicorn timeout”,则广泛报告没有解决方案。)由于某种未知原因,工作进程超时并死亡。这当然会删除我的内存结构。我很困惑,如此简单的架构为何如此难以用 gunocrn 或 uwsgi 可靠地实现
  • 我们在生产中使用 gunicorn 和 uwsgi 的应用程序,并没有注意到超时问题(但后来我们使用 celery 作为作业队列)。
  • 又试了一次,Gunicorn worker 无故超时并存在。当然它需要我所有的内存数据,因为我依靠工作进程不退出。虽然我可以重新编写应用程序以不依赖工作进程来持续运行,但我只是不明白它为什么退出。 7 月 10 日 15:19:20 raspberryVM gunicorn[10941]:[2020-07-10 15:19:20 -0700] [10941] [CRITICAL] 工作人员超时(pid:10944)7 月 10 日 15:19:20 raspberryVM gunicorn[ 10941]:[2020-07-10 15:19:20 -0700] [10944] [INFO] 工人退出(pid:10944)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-05
  • 1970-01-01
  • 2012-10-13
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
  • 1970-01-01
相关资源
最近更新 更多