У нас есть богатое серверное приложение, которое обрабатывает сообщения / очереди, запросы к базе данных и компьютерное зрение. Дополнительной функцией, которая нам нужна, является tcp-связь - предпочтительно через http. Дело в том, что это не в первую очередь веб-приложение. Мы ожидаем, что набор http-каналов будет настроен для разных целей. Да, мы понимаем обмен сообщениями, включая темы и публичные sh -подписки: но прямой запрос на основе протокола TCP также имеет свое место.
Я просмотрел и опробовал полдюжины python http веб-серверов , Они либо неявно, либо явно описывают требование для запуска event loop
в потоке main . Для нас это телега перед лошадью: поток main
уже занят другими задачами, включая координацию других действий.
Чтобы проиллюстрировать предполагаемую структуру, я подниму код из моего aiohttp
-specifi c question Как запустить веб-приложение aiohttp во вторичном потоке . В этом вопросе я попытался запустить другой автономный скрипт, но в подчиненном потоке:
def runWebapp():
from aiohttp import web
async def handle(request):
name = request.match_info.get('name', "Anonymous")
text = "Hello, " + name
return web.Response(text=text)
app = web.Application()
app.add_routes([web.get('/', handle),
web.get('/{name}', handle)])
web.run_app(app)
if __name__ == '__main__':
from threading import Thread
t = Thread(target=runWebapp)
t.start()
print('thread started let''s nap..')
import time
time.sleep(50)
Это выдает ошибку:
RuntimeError: There is no current event loop in thread 'Thread-1'.
Эта ошибка означает «эй, ты не запустив это в потоке main
.
Мы можем логически заменить aiohttp
другими веб-серверами здесь. Есть ли какой-нибудь способ, с помощью которого будет работать этот способ запроса обработки событий веб-сервера l oop во вторичном потоке? До сих пор я также пробовал cherrypy
, tornado
и flask
.
Обратите внимание, что одним известным веб-сервером, который я не пробовал, является django
. Но этот, кажется, требует обширной реструктуризации приложения вокруг структур каталогов, ожидаемых (/ required?) Для django
. Мы бы не хотели этого делать, учитывая, что у приложения есть ряд других целей, которые заменяют этот побочный эффект наличия http-серверов.
Подход, который я посмотрел , - asyncio
. Я не понял, может ли он поддерживать выполнение циклов событий в стороннем потоке или нет: если это так, то это будет ответом на этот вопрос.
В любом случае существуют ли веб-серверы, которые явно поддерживают наличие своего события отрывается от основного потока?