|日期 |数数|
| -----| ------ |
| 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 秒间隔后将新值添加到“数据”列表中。然后它就如人们所期望的那样工作了。我将不胜感激任何帮助!
数据库调用无法正常工作的原因是,数据库调用花费的时间比我的间隔时间长。
因此,当 5 秒间隔过去时,Dash 会更新 n_interval 计数。导致踢另一个调用,这将导致另一个数据库调用,而之前的数据库调用仍然处于挂起状态。
我通过延长间隔时间解决了这个问题。这将有助于在下一次间隔更新发生之前完成数据库调用。