用django和bokeh绘制实时数据的正确方法

Ste*_*uer 14 python django plot bokeh

我有一个嵌入在Django应用程序中的散景图.我在django视图中创建绘图并将绘图推送到散景服务器以在我的网页中显示绘图.

#view.py
def view_plot(request):
    f=figure()
    f.plot(#some data#)
    session = push_session(curdoc())
    context = {'script': autoload_server(f, session_id=session.id)}
    return render_to_response('plot.html', context=context)
Run Code Online (Sandbox Code Playgroud)

一切都很好.现在我想做一个实时图,每次创建一个新的DB-Entry时,应该更新图.我不确定最好的方法是什么.

在网页上使用计时器来询问现在的数据是一个好习惯吗?

或者有没有办法从服务器推送更新,以便每个当前连接的客户端获得更新?

我会非常感谢每一个提示.

非常感谢.

ola*_*lau 5

基本上,您的问题是浏览器使用请求-响应模式:它们发送请求然后立即得到答复。您有两种选择,定期轮询服务器或某种通知系统。

通知可以是长轮询,即客户端发出请求,服务器不响应直到有数据,或通过 websockets 或通过 HTML5 服务器端事件

现在,问题是这些通知系统与传统的 Django 部署集成得不太好,因为它们会导致打开的套接字和相应的挂起线程。因此,如果您的网络服务器有 10 个 Django 线程,则一个带有 10 个选项卡的浏览器可能会占用所有线程。

正在努力改变这一点,但与此同时,除非您有严格的实时要求或大量客户端,否则只需设置一个计时器并每 x 秒轮询一次,其中 x 取决于可接受的延迟。根据您的数据的存储方式,我可能会采用一种简单的机制,以便服务器不会每次都发送整个数据集,而只会发送新的内容或无任何更改的返回代码。

例如,在第一个请求中,服务器可能会在响应中放入一个时间戳或序列号,然后客户端请求自该时间戳/序列号以来的任何更改。

通知系统以更低的开销为您提供更好的延迟,但它可能也更难以部署,如果这只是一个供内部使用的应用程序,则可能会过大。即使使用通知系统,您也需要进行一些仔细的协议设计,以确保不会遗漏任何内容。


t_i*_*_io 4

在我看来,在前端使用类似心跳计时器的东西是可以的,它每秒左右触发一次数据获取。特别是如果您在后端实现了缓存。

更复杂的版本可以使用django 通道之类的东西来处理通过Web 套接字的 通信。

我想说这取决于项目的成熟度。