散景服务器和on.click(on.change)什么都不做

Kri*_*ral 2 python bokeh

我试图让Bokeh服务器打印出来,但是我得到的是一个运行在http:// localhost:5006 /?bokeh-session-id = default的实例,带有单选按钮.当我点击按钮时没有任何反应.有什么我想念的吗?

from bokeh.models.widgets import RadioButtonGroup
from bokeh.plotting import figure, show, output_server


def my_radio_handler():
    print 'Radio button option selected.'


radio_button_group = RadioButtonGroup(
        labels=["Option 1", "Option 2", "Option 3"], active=0)

radio_button_group.on_click(my_radio_handler)

output_server()

show(radio_button_group)
Run Code Online (Sandbox Code Playgroud)

big*_*dot 6

上面的答案显示了如何使用bokeh.clientand push_sessionsession.loop_until_closed.

我想为上下文添加一些注释.(我是Bokeh项目的核心开发人员)

Bokeh应用程序可以运行两种常规方法:

直接在服务器中

这些脚本运行如下:

bokeh serve --show my_app.py
Run Code Online (Sandbox Code Playgroud)

在这种情况下,代码,对象,所有回调等都在散景服务器本身中运行.情况如下:

                          browser <---> Bokeh Server
Run Code Online (Sandbox Code Playgroud)

这是我一直建议的方法.它需要的代码量最少,部署最简单,可以扩展,使用较少的网络流量,并且更加强大.

在单独的Python进程中

也可以使用创建应用程序并在单独的进程中运行回调bokeh.client.那么情况看起来像这样:

               browser <---> Bokeh Server <---> another python process
Run Code Online (Sandbox Code Playgroud)

然后Bokeh服务器真正成为中间人,在浏览器和你的python进程之间传递消息.这有缺点:

  • 网络流量加倍(对于新的python进程,根据定义不可避免)
  • 需要更多代码才能编写(session"服务器应用程序"中不需要的所有内容)
  • 要求python进程无限期地阻塞以回调服务(必须调用session.loop_until_closed)

在过去,有一些特定的用例bokeh.client需要使用,例如:能够自定义每次使用的应用程序会话.但是现在HTML请求参数可用于"服务器应用程序",可以在没有的情况下完成bokeh.client.我想说现在有更少的理由可以达到这种bokeh.client方法.出于这个原因,我总是建议使用该bokeh serve my_app.py方法作为使用Bokeh服务器的第一个最佳方法.


但是,回到手头的问题:那么,如果你忘记打电话,那么在Separate Python Process场景中会发生什么session.loop_until_closed?好吧,python进程(具有你的回调的进程!)完成,进程终止.然后没有什么可以实际运行回调.

嗯,这基本上就是这种情况output_server.它执行会话设置的"前半部分",将对象加载到服务器中,然后调用output_server完成的python脚本,并且不执行任何回调.output_server由于历史事故,基本上仍然存在,但我认为它根本不是很有用.最好的情况是,它可以将没有回调的应用程序加载到Bokeh服务器中,但是为什么除了将Web应用程序连接到真正的python回调之外,您还需要Bokeh服务器?

目前(截至发布时0.12.2)有一个未解决的问题,output_server因为这个原因:

https://github.com/bokeh/bokeh/issues/5154

TLDR; 此时我不建议output_server出于任何原因使用.