You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 12:00:58