问题描述 投票:0回答:1
我一直在尝试使用 Python Dash 创建仪表板。仪表板每 5 秒尝试访问数据库并尝试更新图表。第一次从数据库获取值后,我尝试使用格式中的数据帧的值更新存储。

|日期 |数数|

| -----| ------ |

| 2022 年 1 月 1 日 | 55 |

| 2022 年 2 月 1 日 | 45 |

我尝试将计数保存为列表 [55, 45]。然后每隔 5 秒后,我再次获取数据并使用新值(例如 [55 , 45 , 65 , 30 ....] )扩展数组。但是,dcc.store 不会保存该值,而是在每次更新后作为 dcc.store 的初始值。

from dash import Dash, html, dcc, Input, Output, State import plotly.express as px import dash import time import random import pandas as pd import numpy as np import json import asyncio from bson import ObjectId from pathlib import Path from datetime import datetime from concurrent.futures import ThreadPoolExecutor from dash.exceptions import PreventUpdate from get_data import init # DASH APP app = Dash(__name__) # Interval in milliseconds interval = 5000 app.layout = html.Div( children=[ html.H1(children="Time Series Reach Analysis"), html.P(children="Time Series Dataset from August 2021 to October 2022"), html.Div(id="timeseries-graph", children=[]), html.Div(id="interval-counter", children=[]), dcc.Store(id='df-storage', data=[], storage_type="memory"), dcc.Interval(id='interval-time', interval=interval, n_intervals=0) ], style={ "text-align" : "center" } ) @app.callback( # Returned Values Output("df-storage", "data"), Output("interval-counter", "children"), # Parameters Input("interval-time", "n_intervals"), State("df-storage", "data") ) def refresh_graph(n_intervals, data): storage_value = [] if n_intervals == 0: fetched_df = init() print("0 - Df = ", fetched_df) data.extend(fetched_df["_id"].tolist()) print(f"00 - Values for n_intervals-{n_intervals} and data-{data}") return data , f"Intervals : {n_intervals}" else: fetched_df = init() data.extend(fetched_df["_id"].tolist()) return data , f"Intervals : {n_intervals}" @app.callback( Output("timeseries-graph", "children"), Input("df-storage", "data"), ) def create_graph(data): df = pd.DataFrame(data=data, columns=["_id"]) fig = px.line( df, y="_id", x=df.index.tolist() ) return dcc.Graph(figure=fig) if __name__ == '__main__': app.run_server(debug=True)
init()函数只是从mongodb中获取数据并将其转换为时间戳和计数的数据帧。但是,当我尝试在不从数据库获取数据的情况下执行相同的操作时,相同的代码的行为完全符合预期。

我尝试了相同的代码,但没有使用 random.random() 函数获取数据,并且每 5 秒间隔后将新值添加到“数据”列表中。然后它就如人们所期望的那样工作了。我将不胜感激任何帮助!

python plotly plotly-dash dashboard
1个回答
0
投票
所以我找到了答案。

数据库调用无法正常工作的原因是,数据库调用花费的时间比我的间隔时间长。

因此,当 5 秒间隔过去时,Dash 会更新 n_interval 计数。导致踢另一个调用,这将导致另一个数据库调用,而之前的数据库调用仍然处于挂起状态。

我通过延长间隔时间解决了这个问题。这将有助于在下一次间隔更新发生之前完成数据库调用。

© www.soinside.com 2019 - 2024. All rights reserved.