如何同步Python Plotly/Dash中dcc.Checklist的多用户实例状态
解决方案
Dash默认每个用户访问会话的组件状态相互独立,要实现多用户间的Checklist状态同步,核心是在服务端维护一份全局共享的状态,再通过回调实现状态的双向同步,以下是可直接运行的完整实现:
import dash import dash_core_components as dcc import dash_html_components as html from dash.dependencies import Input, Output app = dash.Dash(__name__) # 服务端全局共享状态,存储Checklist的选中值 shared_checklist_value = ['NYC', 'MTL'] app.layout = html.Div([ # 定时触发器,用于同步全局状态到当前页面 dcc.Interval( id='interval-component', interval=1*1000, # 每1秒同步一次,单位是毫秒 n_intervals=0 ), html.Div([ dcc.Checklist( id='shared-checklist', options=[ {'label': 'New York City', 'value': 'NYC'}, {'label': 'Montréal', 'value': 'MTL'}, {'label': 'San Francisco', 'value': 'SF'} ], value=shared_checklist_value ) ]) ]) # 回调1:任意用户修改Checklist时,更新服务端全局状态 @app.callback( Output('interval-component', 'n_intervals'), Input('shared-checklist', 'value'), prevent_initial_call=True ) def update_global_state(current_value): global shared_checklist_value shared_checklist_value = current_value # 返回空更新不影响Interval的正常计数 return dash.no_update # 回调2:定时拉取服务端全局状态,同步到当前用户的页面 @app.callback( Output('shared-checklist', 'value'), Input('interval-component', 'n_intervals') ) def sync_local_state(n): global shared_checklist_value return shared_checklist_value if __name__ == '__main__': app.run_server(port=8050)
关键说明
- 全局变量
shared_checklist_value存储在服务端内存,所有访问用户共享,是状态同步的核心 - 第一个回调监听Checklist的修改事件,任意用户修改选中状态后都会更新全局变量
- 第二个回调通过
dcc.Interval定时拉取全局状态,自动更新当前页面的Checklist值,实现跨标签页、跨用户的状态同步
注意事项
- 上述实现用内存存储全局状态,服务重启后数据会重置,如果需要持久化可以把状态存在Redis、本地文件或者数据库中
- 如果是多进程部署Dash应用,进程间内存不共享,必须用第三方公共存储(比如Redis)来保存全局状态才能正常同步
- 可以调整
dcc.Interval的interval参数控制同步频率,数值越小同步延迟越低,但服务端压力也会越大,可根据实际场景调整
内容的提问来源于stack exchange,提问作者wrahman
相关产品推荐
相关产品推荐

