Как обновить сервер Bokeh, когда данные становятся доступными через обратные вызовы? - PullRequest
0 голосов
/ 12 июня 2019

Я очень плохо знаком с циклами событий / обратными вызовами в целом.Я использую этот серверный подход, чтобы я мог легко запустить его в Pycharm, основываясь на другом посте.

Я хочу отобразить результаты итерационных алгоритмов для оптимизации пути gcode для физических перьевых плоттеров (проблема TS).

Поэтому мне нужно обновить график боке после завершения цикла алгоритма.Вот скрипт, основанный на других сообщениях, который обновляет данные всякий раз, когда срабатывает обратный вызов ползунка.В качестве замены для реальных данных он генерирует случайные значения.

import numpy as np
from bokeh.application import Application
from bokeh.application.handlers import FunctionHandler
from bokeh.layouts import column
from bokeh.models import ColumnDataSource, Slider
from bokeh.plotting import figure
from bokeh.server.server import Server
from tornado.ioloop import IOLoop

io_loop = IOLoop.current()


def getData():
    l = 50
    x = np.random.rand(1, l)
    y = np.random.rand(1, l)
    return (dict(x=x, y=y))


def modify_doc(doc):
    source = ColumnDataSource(data=getData())

    plot = figure()
    plot.line('x', 'y', source=source)

    slider = Slider(start=1, end=10, value=1, step=0.1)

    def callback(attr, old, new):
        source.data = getData()

    slider.on_change('value', callback)

    doc.add_root(column(slider, plot))


bokeh_app = Application(FunctionHandler(modify_doc))

server = Server({'/': bokeh_app}, io_loop=io_loop)
server.start()

if __name__ == '__main__':
    print('Opening Bokeh application on http://localhost:5006/')
    io_loop.add_callback(server.show, "/")
    io_loop.start()

Однако я не могу понять, где бы я поместил цикл / обратный вызов для обновления графика один раз за цикл, а не на основе вводас ползунка.Это должно быть что-то вроде

best-solution = []

for i in range(100):
    run slow algorithm on best-solution
    find best-result
    update plot with best-result
    best-solution = best-result

Заранее спасибо за любую помощь!

1 Ответ

0 голосов
/ 13 июня 2019

Для запуска любого произвольного кода вы можете использовать кнопку с кодом для запуска в функции обратного вызова кнопки.

def modify_doc(doc):
    source = ColumnDataSource(data=getData())

    def do_stuff():

        for i in range(100):

            ... do_stuff with the data ...

            source.data = data

    button = Button(label='do stuff')
    button.on_click(do_stuff)    

    plot = figure()
    plot.line('x', 'y', source=source)

    doc.add_root(column(button, plot))
...