首页 > 解决方案 > python中的线程在heroku上启动了两次

问题描述

我有一个应用程序在自己的 while true 循环中运行,但我希望它可以通过网站进行交互,所以我的方法是在单独的线程上运行应用程序并使用带有 gunicorn 的烧瓶,但这导致其中两个故障线程启动相同的功能。

这是代码:

from flask import Flask
import threading
from time import sleep

app = Flask(__name__)

@app.route("/")
def home():
    return "hello"

def bot():
    i = 0
    while True:
        sleep(1)
        print(i)
        i += 1
        if i > 100: i = 0

threading.Thread(target=bot).start()

if __name__ == "__main__":
    app.run(use_reloader=False)

档案:

web: gunicorn app:app

Heroku 日志:

2021-07-27T17:42:49.224032+00:00 heroku[web.1]: State changed from starting to up
2021-07-27T17:42:50.282333+00:00 app[web.1]: 0
2021-07-27T17:42:50.282453+00:00 app[web.1]: 0
2021-07-27T17:42:51.283449+00:00 app[web.1]: 1
2021-07-27T17:42:51.283563+00:00 app[web.1]: 1
2021-07-27T17:42:52.284638+00:00 app[web.1]: 2
2021-07-27T17:42:52.289188+00:00 app[web.1]: 2
2021-07-27T17:42:53.285268+00:00 app[web.1]: 3
2021-07-27T17:42:53.286371+00:00 app[web.1]: 3

这只是gunicorn的问题还是heroku的问题?在这个测试应用程序中,同时运行两个实例的线程可能看起来没什么大不了的,但是我正在开发的线程因此而变得一团糟……如果这只是 gunicorn 中的一个小故障,请向我推荐其他的在生产中使用的服务器将与多个线程一起使用。

标签: pythonmultithreadingflaskherokupython-multithreading

解决方案


已经快一周了,我自己找到了解决方案......我正在回答这篇文章以帮助其他有同样问题的人。

问题是 heroku 自动启动 gunicorn 时有 2 个工作线程,这意味着应用程序同时运行 2 次。但这有一个简单的解决方法:

只需将您的 Procfile 编辑为:

web: gunicorn app:app --workers 1

推荐阅读