关闭Holoviz Panel应用浏览器窗口时,能否自动终止panel serve进程?
实现关闭浏览器标签页时自动终止Panel Serve进程
可以通过监听Bokeh服务器的会话销毁事件来实现这个需求——当最后一个活跃的浏览器会话关闭时,自动终止服务进程。以下是两种可行方案:
方案一:自定义服务器启动脚本(无需panel serve命令)
直接在脚本中启动Bokeh服务器,注册会话销毁回调,当最后一个会话关闭时自动退出进程:
import panel as pn import param import sys from bokeh.server.server import Server class Test(param.Parameterized): test_number = param.Integer(default=0) test = Test() app = pn.template.VanillaTemplate() app.main.append(test.param) def on_session_destroyed(session_context): # 获取当前服务器实例 server = session_context.server # 统计剩余活跃会话数 active_sessions = list(server.get_sessions()) # 当最后一个会话关闭时,停止服务器并退出进程 if len(active_sessions) == 0: server.stop() sys.exit() # 创建服务器并绑定应用路由 server = Server({'/': app}, num_procs=1) # 注册会话销毁监听回调 server.on_session_destroyed(on_session_destroyed) # 启动服务器 server.start() if __name__ == '__main__': server.io_loop.start()
运行方式:直接执行脚本(python app.py),关闭浏览器标签页后,终端进程会自动退出。
方案二:适配panel serve命令的写法
如果坚持使用panel serve命令启动,可通过Panel的文档加载回调注册会话监听:
import panel as pn import param import sys class Test(param.Parameterized): test_number = param.Integer(default=0) test = Test() app = pn.template.VanillaTemplate() app.main.append(test.param) def check_and_shutdown(): server = pn.state.curdoc().server if server is not None: active_sessions = list(server.get_sessions()) # 无活跃会话时终止服务 if len(active_sessions) == 0: server.stop() sys.exit() def on_document_ready(doc): # 注册会话销毁回调 def on_session_destroyed(session_context): check_and_shutdown() doc.server.on_session_destroyed(on_session_destroyed) # 文档加载时绑定回调 pn.state.onload(on_document_ready) app.servable()
运行方式:使用panel serve app.py --num-procs=1命令启动(必须指定--num-procs=1,多进程模式下无法触发全局退出),关闭最后一个浏览器标签页后,服务进程会自动终止。
注意事项
- 两种方案均基于「最后一个活跃会话关闭」触发退出,若同时打开多个标签页(多个会话),需关闭所有标签页才会终止服务。
内容的提问来源于stack exchange,提问作者SultanOrazbayev
相关产品推荐
相关产品推荐

