luk*_*key 5 python django wsgi bokeh
我正在尝试使用bokeh-server可执行文件通过Django提供散景文档,这可以创建一个Tornado实例.可以通过Session.object_link方法提供的URL访问散景文档.导航到时,散景服务器可执行文件将其写入stdout(IP地址已替换为省略号):
INFO:tornado.access:200 POST /bokeh/bb/71cee48b-5122-4275-bd4f-d137ea1374e5/gc (...) 222.55ms
INFO:tornado.access:200 GET /bokeh/bb/71cee48b-5122-4275-bd4f-d137ea1374e5/ (...) 110.15ms
INFO:tornado.access:200 POST /bokeh/bb/71cee48b-5122-4275-bd4f-d137ea1374e5/gc (...) 232.66ms
INFO:tornado.access:200 GET /bokeh/bb/71cee48b-5122-4275-bd4f-d137ea1374e5/ (...) 114.16ms
Run Code Online (Sandbox Code Playgroud)
这似乎是运行Django WSGI应用程序(由运行mod_wsgi的Apache初始化)和散景服务器可执行文件的python实例之间的通信.
当浏览器发送响应(包括散景界面所需的图形和数据等)时,浏览器会有一些初始网络,如果与具有python回调的图形进行任何交互,则会进行网络连接.当用户关闭窗口或浏览器时,上述相同的网络将继续.此外,只有当Django或散景服务器进程被杀死时,网络才会停止.
为了启动散景会话并将URL传递回Django模板,有必要在新线程中启动散景会话:
def get_bokeh_url(self, context):
t = Thread(target=self.run)
t.start()
return self.session.object_link(self.document.context)
def run(self):
return self.session.poll_document(self.document)
Run Code Online (Sandbox Code Playgroud)
self.session并且self.document在线程启动之前都被初始化了.因此,在调用get_bokeh_url时,文档上有一些图形,其中一些图形具有交互回调,并且已创建会话但未通过轮询poll_document(这似乎是交互所必需的).
除非你杀掉Django或者是bokeh服务器,否则线程会一直运行.这意味着当更多请求通过时,会构建更多线程并增加网络数量.
我的问题是,一旦在浏览器中不再查看文档,有没有办法杀死该线程?
我一直在思考的一个答案是在浏览器关闭时向服务器发送快速请求,并以某种方式终止该文档的线程.我试过从散景界面删除文件,但这没有效果.
Bokeh 服务器定期检查是否存在与会话的连接。如果一段时间没有连接,会话就会过期并被销毁。
从版本 0.12.1 开始,检查间隔和最大无连接时间默认分别为 17 秒和 60 秒。您可以通过像这样运行服务器来覆盖它们
bokeh serve --check-unused-sessions 1000 --unused-session-lifetime 1000 app.py
Run Code Online (Sandbox Code Playgroud)
这在文档中很难找到,它在CLI 文档和开发人员指南中的“服务器架构”一章中的“应用程序、会话和连接”部分中进行了描述。关于此主题还有一个已关闭的 Github 问题:关闭选项卡后定期回调继续#3770
如果您在会话被销毁时需要自定义逻辑,请为您的应用程序使用目录部署格式并添加一个server_lifecycle.py包含Lifecycle Hooks 的文件,特别是这个:
def on_session_destroyed(session_context):
''' If present, this function is called when a session is closed. '''
pass
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1148 次 |
| 最近记录: |