我使用python和bokeh实现流式实时图形。我想把几个活生生的图放进一个网格图,然后运行到一种“死亡锁”中
图形(有很多)由不同的类创建,图形对象返回,然后用作gridplot()
函数的输入
对于实时图形curdoc().add_periodic_callback(update1300)引用更新例程。我直接从update1()
调用其他图的更新例程。这是可行的,但不断给我以下错误:
`raise RuntimeError("_pending_writes should be non-None when we have a document lock, and we should have the lock when the document changes")
这是预期的行为,因为其他图形的数据是从其对象的“外部”和“未注册的更新例程”更改的。我想消除这个错误
在我的主对象中(布局被拼凑在一起并调用curdoc().add_root()
),我打算通过curdoc().add_periodic_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)
这是行不通的
免责声明:我在自己的工作中处理这个错误已经两周了,今天终于解决了这个问题。(:当您看到的每个样本都带有一个csv文件,该文件在同一线程中读取并推送到文档时,这很容易,但是当事情变得真实,并且您有一个流式客户端在做同样的事情时,突然一切都停止了工作
一般的问题是,
Bokeh
服务器需要保持其文档模型的版本与Bokeh
客户端的文档模型保持同步。这是通过一系列事件以及客户端(浏览器中运行的Javascript)和服务器(稍后我们将讨论的事件循环中)之间发生的通信来实现的因此,每次您需要更改文档时,文档都需要被锁定(我能想到的最简单的原因是并发性)。解决此问题的最简单方法是告诉您持有的Bokeh文档实例,您需要进行更改,并请求回调,因此
Bokeh
管理何时呼叫您的代表并允许您更新文档话虽如此,
bokeh.plotting.Document
中很少有方法可以帮助您请求回调例如,如果需要ASAP回调,您可能希望根据您的用例使用的方法是^{
需要记住的一点是,指向文档的引用/指针必须正确
为了确保这一点,我将我所有的图表应用程序包装到一个类中,并在内部保留了一个
doc
实例,以便在收到新数据时访问它的add_next_tick_callback
。我可以指出正确的实例的方法是使用bokeh.server.server.Server
初始化我的Bokeh应用程序-当它初始化应用程序时,您将收到一个doc
在启动服务器之前创建的变量-这将是对您在应用程序中显示的文档的正确引用。在类中使用此“图表初始值设定项”的一个好处是,您可以根据需要多次实例化它以构建更多图表/文档现在,如果您是数据管道和流式处理的爱好者,并且使用类似
StreamZ
的方法将数据流式处理到您可能拥有的Pipe
或Buffer
实例,那么您必须记住一件事:请注意在线程内或线程外异步发生的情况。
Bokeh
在很大程度上依赖于tornado.ioloop.IOLoop
,如果您接近异步运行,您一定遇到了asyncio
这两个模块上的事件循环可能会冲突,并将影响您更改文档的方式/时间
如果在线程中运行流媒体(正如我编写的流媒体客户端所做的那样),请确保线程具有当前循环,否则将面临其他类似问题。线程可能会与内部创建的循环发生冲突,并影响它们之间的交互方式
使用类似以下内容:
最后,请注意
@gen.coroutine
在tornado
中所做的事情。按照我的理解,如果以异步方式进行操作,则流式处理的回调必须用@gen.coroutine
修饰相关问题 更多 >
编程相关推荐