У меня есть множество файлов сервера 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