Dash程序运行时代码重复执行两次的问题求助
Dash调试模式下代码重复执行的问题
复现代码
import dash from dash import html if __name__ == '__main__': print("This should print once") app = dash.Dash(__name__) # 定义Dash应用布局 app.layout = html.Div( children=[ html.H1("Hello, Dash!") ] ) app.run_server(debug=True)
问题情况
在VSCode里运行这段代码时,print("This should print once")会执行两次,控制台会打出两遍内容。放到实际项目里更麻烦,会生成两个WebSocket对象、打开两个流,整个程序逻辑被重复执行。本来if __name__ == '__main__':是用来防止代码被Dash自动导入时重复运行的,结果却出现了两个main命名空间的状况。
原因分析
这是因为Dash的调试模式(debug=True)默认开启了代码热重载功能。开启热重载后,Dash会启动两个进程:
- 主进程:负责监听文件变化,一旦检测到代码修改就自动重启应用;
- 子进程:真正运行你的应用代码。
结合VSCode的运行机制,这两个进程中的__name__都会被设为'__main__',所以if __name__ == '__main__':代码块里的内容会被执行两次。
解决办法
有两种实用的解决方式:
- 关闭热重载:如果不需要代码修改后自动刷新,可以在启动服务器时禁用热重载:
app.run_server(debug=True, use_reloader=False)
这样只会启动一个进程,代码只会执行一次。
- 调整代码结构:把应用初始化的代码也放进
if __name__ == '__main__':块里,确保只有主进程会执行这些逻辑:
import dash from dash import html if __name__ == '__main__': print("This should print once") app = dash.Dash(__name__) app.layout = html.Div( children=[ html.H1("Hello, Dash!") ] ) app.run_server(debug=True)
这种方式既能保留热重载的便利,又能避免重复执行初始化逻辑。
内容的提问来源于stack exchange,提问作者Philip C.
相关产品推荐
相关产品推荐

