Python bokeh不同对象中的多个实时流图/位于其他类中的寄存器更新例程
我使用python和bokeh实现流式实时图形。我想把几个活生生的图放进一个网格图,然后运行到一种“死亡锁”中 图形(有很多)由不同的类创建,图形对象返回,然后用作Python bokeh不同对象中的多个实时流图/位于其他类中的寄存器更新例程,python,graph,stream,bokeh,live,Python,Graph,Stream,Bokeh,Live,我使用python和bokeh实现流式实时图形。我想把几个活生生的图放进一个网格图,然后运行到一种“死亡锁”中 图形(有很多)由不同的类创建,图形对象返回,然后用作gridplot()函数的输入 对于实时图形curdoc().add_periodic_callback(update1300)引用更新例程。我直接从update1()调用其他图形的更新例程。这是可行的,但不断给我以下错误: `raise RUNTIMERROR(“\u pending\u writes在有文档锁时应为非None,并且
gridplot()
函数的输入
对于实时图形curdoc().add_periodic_callback(update1300)引用更新例程。我直接从update1()
调用其他图形的更新例程。这是可行的,但不断给我以下错误:
`raise RUNTIMERROR(“\u pending\u writes在有文档锁时应为非None,并且在文档更改时应具有锁”)
这是预期的行为,因为其他图形的数据是从其对象的“外部”和“未注册的更新例程”更改的。我想消除这个错误
在我的主对象中(布局是拼凑在一起的,调用了curdoc().add\u root()
),我打算通过curdoc().add\u periodic\u callback()
注册其他图形更新例程(必须是常规对象例程,以便可以引用它们)。这种方法的问题是,对象更新函数采用self参数,而bokeh不接受这一点
但是如果没有self,我就无法完成,因为update()需要引用source.stream
对象
我不知道如何解决这个问题,也不知道如何以“正确”的方式解决。欢迎提出建议
谢谢
请澄清:
主要目标:
def graph(self):
.... bokeh code
@count()
def update(t):
.... update code
curdoc()
curdoc().添加定期回调(更新,300)
这很有效
通用其他对象
def graph(self):
.... bokeh code
def update(self,t): ....
main object:
curdoc().add_periodic_callback(other_object.update, 300)
这是行不通的
_pending_writes在有文档锁定时应为非None,并且在文档更改时应具有锁定
免责声明:我已经在自己的工作中处理这个错误两周了,今天终于解决了这个问题。(:当您看到的每个样本都带有一个csv文件,该文件在同一线程中读取并推送到文档时,这很容易,但是当事情变得真实,并且您有一个流式客户端在做同样的事情时,突然一切都停止了工作
一般的问题是,Bokeh
服务器需要保持其文档模型版本与Bokeh
客户端的版本同步。这是通过一系列事件以及客户端(浏览器中运行的Javascript)和服务器(在稍后我们将讨论的事件循环中)之间发生的通信来实现的
因此,每当您需要更改文档(这本质上会影响模型)时,都需要锁定文档(我能想到的最简单的原因是并发性)。解决此问题的最简单方法是告诉您持有的Bokeh文档实例,您需要进行更改-并请求回调,以便Bokeh
管理何时呼叫您的代表并允许您更新文档
话虽如此,bokeh.plotting.Document
中很少有方法可以帮助您请求回调
- 根据您的用例,您可能希望使用的方法是
add\u next\u tick\u callback
- 需要记住的一点是,指向文档的引用/指针必须正确
doc
的实例,以便在收到新数据时访问其add_next_tick_callback
。我可以指出正确的实例的方法是,在我启动Bokeh应用程序时,使用Bokeh.server.server.server
初始化应用程序时,您将收到一个在启动服务器之前创建的doc
变量-这将是对您在应用程序中显示的文档的正确引用。在类中使用此“图表初始值设定项”的一个好处是,您可以根据需要多次实例化它,以构建更多图表/文档
现在,如果您是数据管道和流式处理的爱好者,并且使用类似于StreamZ
的方法将数据流式处理到您可能拥有的Pipe
或Buffer
实例,那么您必须记住一件事:
- 请注意线程内或线程外异步发生的情况。
在很大程度上依赖于Bokeh
,如果您接近异步运行,您一定遇到了tornado.ioloop.ioloop
asyncio
- 这两个模块上的事件循环可能会冲突,并将影响您更改文档的方式/时间
asyncio.set_event_loop(asyncio.new_event_loop())
最后,请注意@gen.coroutine
在tornado
中的作用。按照我的理解,如果您以异步方式进行操作,则流式处理的回调必须使用@gen.coroutine
进行修饰
_pending_writes在有文档锁定时应为非None,并且在文档更改时应具有锁定
免责声明:我已经在自己的工作中处理这个错误两周了,今天终于解决了这个问题。(:当您看到的每个样本都带有一个csv文件,该文件在同一线程中读取并推送到文档时,这很容易,但是当事情变得真实,并且您有一个流式客户端在做同样的事情时,突然一切都停止了工作
一般问题是,Bokeh