Plotly Dash启动时数据集重复加载问题排查
问题:Plotly Dash中单例类数据集重复加载的原因
我正在使用Plotly Dash构建仪表盘,计划在启动时加载一份需供仪表盘内所有方法调用的数据集,因此将其存入单例类MyData中。但启动仪表盘时,控制台两次输出“generated”,说明数据集被重复加载。以下是可复现该问题的最小示例代码:
代码文件
app.py
from dash import Dash, dcc, html from callbacks import get_callbacks from data import MyData app = Dash(__name__, suppress_callback_exceptions=True) get_callbacks(app) #load all callbacks m = MyData() #load data at start of the dashboard -- somehow, this happens twice? if __name__ == '__main__': app.layout = html.Div([dcc.Location(id="url")]) app.run_server(debug=True)
data.py
import pandas as pd def generate_df(): print("generated") return pd.DataFrame({'a':[1,2,3]}) class MyData: def __new__(cls): if not hasattr(cls, 'instance'): cls.instance = super(MyData, cls).__new__(cls) return cls.instance def __init__(self): self.df = generate_df()
callbacks.py
def get_callbacks(app): pass
请问这份数据集的重复加载是如何发生的?
原因分析
出现重复加载的问题有两个核心因素:
Dash调试模式的进程机制
当你用debug=True启动Dash应用时,Dash会启动两个进程:主进程和负责热重载的子进程。而你把m = MyData()写在了if __name__ == '__main__':代码块之外,这会导致两个进程在启动阶段都会执行这条语句,触发两次实例化操作。单例类的实现漏洞
你的MyData类仅通过__new__方法保证了只会创建一个实例,但Python中每次调用MyData()时,不管是不是已有实例,都会自动执行__init__方法。也就是说,哪怕是同一个实例,每次调用都会重新执行self.df = generate_df(),直接导致generate_df被重复调用,控制台两次输出“generated”。
内容的提问来源于stack exchange,提问作者TylerD
相关产品推荐
相关产品推荐

