我使用以下函数以编程方式设置散景服务器。
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
一切都很笨拙,我在两个网址上都有个别情节。我很好奇为什么会这样,想知道我是否可以避免创建所有应用程序并单独添加它们?
答案 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。