我正在尝试 (a) 有一个工作线程来执行一些后台工作,以及 (b) 使用 Dash 监控其进度。由于某种原因,在执行代码时,脚本被加载两次,并且最终运行了两个工作线程。下面的代码重现了这种情况。
import threading
import time
from threading import Thread
from dash import Dash, html
print("Load script")
def worker():
print(f"Worker started; Thread {threading.get_ident()}")
i = 0
while True:
time.sleep(5)
print(f"Thread {threading.get_ident()}, iteration {i}")
i += 1
if __name__ == "__main__":
app = Dash("App")
app.layout = html.Div([html.Div(id='dummy')])
worker_thread = Thread(target=worker)
worker_thread.start()
app.run(debug=True)
输出为:
Load script
Worker started; Thread 6179811328
Dash is running on http://127.0.0.1:8050/
* Serving Flask app 'App'
* Debug mode: on
Load script
Worker started; Thread 6121779200
Thread 6179811328, iteration 0
Thread 6121779200, iteration 0
如输出所示,脚本被第二次加载,并创建了另一个工作线程。我想知道为什么以及如何防止它。
我无法给你确切的“为什么”,但它与破折号/烧瓶打开的“调试模式”有关。启动时,它会启动整个应用程序两次,运行主脚本两次,因此,在您的情况下,创建两个线程来打印每次迭代。
可以通过
app.run(debug=False)
将其关闭。
请注意:如果您以不同的方式运行应用程序(即使用
flask run
),请确保使用适当的标志来禁用/启用调试模式。