如何避免在Bokeh服务器上为不同的应用程序显示相同的图?

时间:2018-04-14 09:54:41

标签: python bokeh

我使用以下函数以编程方式设置散景服务器。

def setup_bokeh_server(data):
'''
Sets up Bokeh Application instances on server.
'''

    def run_server(url_func_map):
        server = Server(url_func_map,
                    allow_websocket_origin=['localhost:8888',
                                            'localhost:5006'])
        server.start()
        server.io_loop.start()

    url_func_map = {}
    for name, app in data['bokeh_apps'].items():
        url_func_map['/'+name] = app

    p = multiprocessing.Process(target=run_server, args=(url_func_map,))
    p.start()
    p.join()

在我设置服务器之前,我创建了Bokeh应用程序并将它们添加到数据[' bokeh_apps']。

def setup_plot_data(data):
'''
Creates Bokeh Application to be rendered by server.
'''

    def plot_maker(doc, x=[], y=[], name=''):

        source = ColumnDataSource(data={'x':x, 'y':y})

        fig = figure(title=name)
        fig.line(x='x', y='y', source=source)

        doc.add_root(fig)
        return doc

    args_dict = {'1':{'x':[1,2,3,4],'y':[4,3,2,1],'name':'plot_1'},
                 '2':{'x':[1,2,3,4],'y':[4,3,2,1],'name':'plot_2'}}
    for args_num, args in args_dict.items():
        render_foo = lambda doc: plot_maker(doc, **args)
        handler = FunctionHandler(render_foo)
        app = Application(handler)
        data['bokeh_apps'][args['name']] = app

使用此方法会导致在两个散景服务器URL上呈现相同的图:s(要添加到数据的最后一个应用程序[' bokeh_apps']将在两个URL上呈现:s)。但是,当我跳过for循环并一次添加一个应用程序时:

render_foo = lambda doc: plot_maker([1,2,3,4], [1,2,3,4], 'plot_1', doc)
handler = FunctionHandler(render_foo)
app = Application(handler)
data['bokeh_apps']['plot_1'] = app

render_foo = lambda doc: plot_maker([1,2,3,4], [4,3,2,1], 'plot_2', doc)
handler = FunctionHandler(render_foo)
app = Application(handler)
data['bokeh_apps']['plot_2'] = app

一切都很笨拙,我在两个网址上都有个别情节。我很好奇为什么会这样,想知道我是否可以避免创建所有应用程序并单独添加它们?

1 个答案:

答案 0 :(得分:0)

它不需要对Bokeh做任何事情 - 你刚刚在工作中体验过Python闭包。

考虑运行这个小片段,但首先尝试猜测它会打印什么:

def f(idx):
    print(idx)


fs = []
for i in range(3):
    fs.append(lambda: f(i))

for fn in fs:
    fn()

更多详细信息,请参阅this SO question