Python中Flask应用_thread线程函数重复执行问题求助
问题原因及解决办法
原因
你的代码里app.run设置了use_reloader=True,这是Flask的自动重载功能,它会启动两个进程:一个是监控文件变化的重载器进程,另一个是实际运行Flask应用的工作进程。这两个进程都会触发if __name__ == '__main__':代码块,所以_thread.start_new_thread(callPCo, ())会被执行两次,导致callPCo函数运行两次。
解决办法
有两种方案可以解决这个问题:
方案1:关闭自动重载功能
直接把use_reloader设为False,这样只会启动一个进程,线程只会执行一次:
def callPCo(): requests.get("http://127.0.0.1:5120/pco") if __name__ == '__main__': _thread.start_new_thread(callPCo, ()) app.run(host = "127.0.0.1", port = "5115", use_reloader=False)
方案2:保留重载功能,仅在主进程启动线程
如果你需要保留自动重载,可以通过检查是否是重载器的子进程来控制线程启动,利用Flask重载器的环境变量判断:
import os def callPCo(): requests.get("http://127.0.0.1:5120/pco") if __name__ == '__main__': # 仅在主进程启动线程,重载器进程跳过 if not os.environ.get('WERKZEUG_RUN_MAIN'): _thread.start_new_thread(callPCo, ()) app.run(host = "127.0.0.1", port = "5115", use_reloader=True)
内容的提问来源于stack exchange,提问作者wondergrandma
相关产品推荐
相关产品推荐

