Bokeh Server启动时加载屏无法正常显示的问题排查
解决Bokeh Server初始加载时加载屏不生效的问题
问题根源在于初始启动时,curdoc().add_next_tick_callback()是在服务器端文档初始化阶段就被执行,此时客户端还未建立WebSocket连接,计算直接在服务器端完成后一次性推送给客户端,导致加载屏根本没机会在客户端显示。
解决方案:利用on_session_created事件触发初始计算
Bokeh Server提供了on_session_created事件,该事件会在客户端成功建立WebSocket连接并创建会话后触发,刚好满足我们需要在客户端加载完初始UI(包括加载屏)后再执行计算的需求。
修改后的代码如下:
from bokeh.plotting import curdoc from main_frame import MainFrame print('start') # 构造函数包含创建加载屏的代码 main_frame = MainFrame() curdoc().add_root(main_frame.layout) def handle_session_init(session_context): # 客户端会话建立后,安排计算回调 session_context.session.document.add_next_tick_callback(lambda: main_frame.plot('initial_file_name')) curdoc().on_session_created(handle_session_init) print('after adding session callback')
原理说明
on_session_created回调会在每个客户端连接到应用时触发,确保计算逻辑是在客户端已经渲染出初始加载屏之后才执行。- 计算过程中,加载屏会保持显示状态,直到
main_frame.plot()方法完成计算并更新UI组件(替换加载屏为图表内容)。
额外检查点
确保你的MainFrame类中,plot()方法的逻辑是:
- 开始计算前保持加载屏可见
- 计算完成后隐藏加载屏,显示生成的图表
内容的提问来源于stack exchange,提问作者Aziuth
相关产品推荐
相关产品推荐

