python - 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 中的一个小故障,请向我推荐其他的在生产中使用的服务器将与多个线程一起使用。
解决方案
已经快一周了,我自己找到了解决方案......我正在回答这篇文章以帮助其他有同样问题的人。
问题是 heroku 自动启动 gunicorn 时有 2 个工作线程,这意味着应用程序同时运行 2 次。但这有一个简单的解决方法:
只需将您的 Procfile 编辑为:
web: gunicorn app:app --workers 1
推荐阅读
- php - json_decode getting JSON_ERROR_SYNTAX on POST request
- spring-kafka - @EventListener 中的 SPEL 表达式
- python - tf.keras 卷积架构不起作用
- html - Bootstrap 输入背景不覆盖整个输入
- r - lm 的系数太多
- tensorflow - 为 LSTM RNN 预测时间序列动态找到正确的时间步长
- ruby-on-rails - 在 Rails API 响应中获取未找到记录的部分原始 SQL
- r - 如何在 R 中制作数组矩阵?
- java - 如何通过字节码分析收集常量表达式的用法?
- html - 表格无法居中和最大宽度