bokeh不同对象中的多个实时流图/位于其他类中的寄存器更新例程

2024-09-27 07:35:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用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)

这是行不通的


Tags: 对象函数selfadd图形def错误callback
1条回答
网友
1楼 · 发布于 2024-09-27 07:35:20

"_pending_writes should be non-None when we have a document lock, and we should have the lock when the document changes"

免责声明:我在自己的工作中处理这个错误已经两周了,今天终于解决了这个问题。(:当您看到的每个样本都带有一个csv文件,该文件在同一线程中读取并推送到文档时,这很容易,但是当事情变得真实,并且您有一个流式客户端在做同样的事情时,突然一切都停止了工作

一般的问题是,Bokeh服务器需要保持其文档模型的版本与Bokeh客户端的文档模型保持同步。这是通过一系列事件以及客户端(浏览器中运行的Javascript)和服务器(稍后我们将讨论的事件循环中)之间发生的通信来实现的

因此,每次您需要更改文档时,文档都需要被锁定(我能想到的最简单的原因是并发性)。解决此问题的最简单方法是告诉您持有的Bokeh文档实例,您需要进行更改,并请求回调,因此Bokeh管理何时呼叫您的代表并允许您更新文档

话虽如此,bokeh.plotting.Document中很少有方法可以帮助您请求回调

  • 例如,如果需要ASAP回调,您可能希望根据您的用例使用的方法是^{

  • 需要记住的一点是,指向文档的引用/指针必须正确

为了确保这一点,我将我所有的图表应用程序包装到一个类中,并在内部保留了一个doc实例,以便在收到新数据时访问它的add_next_tick_callback。我可以指出正确的实例的方法是使用bokeh.server.server.Server初始化我的Bokeh应用程序-当它初始化应用程序时,您将收到一个doc在启动服务器之前创建的变量-这将是对您在应用程序中显示的文档的正确引用。在类中使用此“图表初始值设定项”的一个好处是,您可以根据需要多次实例化它以构建更多图表/文档

现在,如果您是数据管道和流式处理的爱好者,并且使用类似StreamZ的方法将数据流式处理到您可能拥有的PipeBuffer实例,那么您必须记住一件事:

  • 请注意在线程内或线程外异步发生的情况。Bokeh在很大程度上依赖于tornado.ioloop.IOLoop,如果您接近异步运行,您一定遇到了asyncio

  • 这两个模块上的事件循环可能会冲突,并将影响您更改文档的方式/时间

如果在线程中运行流媒体(正如我编写的流媒体客户端所做的那样),请确保线程具有当前循环,否则将面临其他类似问题。线程可能会与内部创建的循环发生冲突,并影响它们之间的交互方式

使用类似以下内容:

asyncio.set_event_loop(asyncio.new_event_loop())

最后,请注意@gen.coroutinetornado中所做的事情。按照我的理解,如果以异步方式进行操作,则流式处理的回调必须用@gen.coroutine修饰

相关问题 更多 >

    热门问题