Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python bokeh不同对象中的多个实时流图/位于其他类中的寄存器更新例程_Python_Graph_Stream_Bokeh_Live - Fatal编程技术网

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,并且

我使用python和bokeh实现流式实时图形。我想把几个活生生的图放进一个网格图,然后运行到一种“死亡锁”中

图形(有很多)由不同的类创建,图形对象返回,然后用作
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