Flask / Bokeh / Tornado6.0.2: встроенные серверы Bokeh больше не работают после обновления Tornado - PullRequest
0 голосов
/ 29 марта 2019

У меня есть множество файлов сервера Bokeh в каталоге, скажем .. / dir / bokeh /, предположим, что серверы bokeh называются bokeh1.py, bokeh2.py, bokeh3.py Структура файла выглядит так:

|--dir
    |---flask.py
    |---bokeh
          |--bokeh1.py
          |--bokeh2.py

Я развертываю их все на фляге следующим образом:

files=[]
for file in os.listdir("/dir/bokeh/"):
    if file.endswith('.py'):
        file="bokeh/"+file
        files.append(file)

argvs = {}
urls = []
for i in files:
    argvs[i] = None
    urls.append(i.split('\\')[-1].split('.')[0])
host = 'myhost.com'

apps = build_single_handler_applications(files, argvs)

bokeh_tornado = BokehTornado(apps, extra_websocket_origins=["myhost.com"])
bokeh_http = HTTPServer(bokeh_tornado)
sockets, port = bind_sockets("myhost.com", 0)
bokeh_http.add_sockets(sockets)

При обновлении до Tornado 6.0.2 и развертывании Flask я получаю Runtimerror There is no current event loop in thread Thread-1.При более глубоком исследовании Tornado использует asyncio по умолчанию и накладывает некоторые ограничения.Поэтому я добавляю asyncio.set_event_loop(asyncio.new_event_loop()) к следующему.

def bk_worker():
    asyncio.set_event_loop(asyncio.new_event_loop())####
    server = BaseServer(IOLoop.current(), bokeh_tornado, bokeh_http)
    server.start()
    server.io_loop.start()
    gc.collect()

from threading import Thread

Thread(target=bk_worker).start()

Однако при открытии URL-адреса сервера bokeh через флягу выбранный сервер bokeh (любой из них) не загружается и просто возвращает пустую страницу.Как мне обойти это?

настройка asyncio.set_event_loop_policy(AnyThreadEventLoopPolicy)) дает тот же результат.

edit: предыдущий код работает с python 2/3, Tornado 4.5.3

1 Ответ

1 голос
/ 29 марта 2019

Я думаю, что это известная проблема с боке . Лучший способ на данный момент - понизить Tornado до 4.5.3.

...