Боке поток на ColumnDataSource не обновляет график - PullRequest
0 голосов
/ 21 сентября 2019

Я пытаюсь создать график Боке, который обновляется при получении данных.Я использую add_next_tick_callback(listener) для отправки данных с запросами, используя curl "http://localhost:5006/mviz/?vpom=0.9&rpom=0.9".Данные считываются правильно при отправке с использованием curl, но,

  1. График в браузере не обновляется при вызове source.stream.
  2. После многократной отправки данных я ожидал, чтодобавляйте новые данные к source.data каждый раз, увеличивая количество строк.Но даже после многократного нажатия на команду curl, она каждый раз печатает только одно и то же число строк (только четыре строки, одна новая строка добавляется к трем строкам при инициализации).

Послеэто скрипт, который у меня есть в файле mviz.py, который я запускаю, вызывая bokeh serve mviz.py с использованием Bokeh версии 1.0.4:

from bokeh.layouts import column
from bokeh.models import ColumnDataSource
from bokeh.plotting import figure, curdoc
from bokeh.server.server import Server

source = ColumnDataSource({"vpom": [0.1, 0.2, 0.3], "rpom": [0.2, 0.3, 0.4]})
fig = figure(title='Streaming Circle Plot!', sizing_mode='scale_width',
        x_range=[0, 1], y_range=[0, 1])
fig.circle(source=source, x='vpom', y='rpom', size=10)
curdoc().add_root(column(fig))
curdoc().title = "Now with live updating!"

def listener():
  req = curdoc().session_context
  if req is not None:
      args = req.request.arguments
      print "recv", args
      if args:
          source.stream({k:map(float,v) for k,v in args.items()}, 100)
          print source.data

curdoc().add_next_tick_callback(listener)

Может кто-нибудь указать проблемы с приведенным выше скриптом и прокомментировать, если это правильноспособ использовать Boekh для этого варианта использования.

1 Ответ

0 голосов
/ 21 сентября 2019

Есть несколько проблем / недоразумений с этим подходом:

  • Каждый раз, когда делается запрос к серверу Bokeh, создается Session, а также Document для этой сессии.Document - это коллекция всех ваших объектов (графики, виджеты и т. Д.), Которые сервер Bokeh синхронизирует автоматически между Python и JS.Откуда этот документ? Код приложения выполняется для его генерации .Повторим еще один способ: код приложения запускается заново каждый раз, когда устанавливается соединение .

    Непосредственным следствием является то, что, как написано, ничто вообще не будет «сохраняться» или «накапливаться»между HTTP-запросами с кодом выше.Каждое новое соединение - это чистый лист.Весь код приложения будет запускаться при каждом новом подключении, но сначала он может найти и загрузить все предыдущие данные из внешнего хранилища данных в качестве первого шага.

  • An add_next_tick_callback вверхний уровень будет выполняться даже до загрузки сеанса в браузер.Нет смысла помещать add_next_tick_callback на верхнем уровне (то есть вне какой-либо другой кнопки или кода обратного вызова виджета), потому что конечный эффект такой же, как просто помещение кода внутри функции обратного вызова на верхнем уровне.Он завершает работу еще до того, как что-либо попадет в браузер пользователя.

Итак, что вы можете сделать, чтобы реализовать что-то подобное?

  • Если вы действительно хотите поразить URL приложения Bokeh только аргументами запроса,код вашего приложения должен быть явно ответственным за сохранение и загрузку состояния между запросами.Это может быть простой файл, который он читает / записывает, или через какую-то внешнюю базу данных, к которой он подключается.

  • В качестве альтернативы, вы можете встроить Bokeh в качестве библиотеки , и в этом случае вы можете добавить новые обработчики запросов для новых собственных конечных точек в базовое приложение Tornado.Эти обработчики могут сохранять / накапливать состояние (во время работы сервера Bokeh).Как отправить / передать обновления для любых существующих открытых сессий - это более сложный вопрос, который зависит от ваших требований.

...