Запуск любого события веб-сервера l oop во вторичном потоке - PullRequest
1 голос
/ 02 апреля 2020

У нас есть богатое серверное приложение, которое обрабатывает сообщения / очереди, запросы к базе данных и компьютерное зрение. Дополнительной функцией, которая нам нужна, является 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. Я не понял, может ли он поддерживать выполнение циклов событий в стороннем потоке или нет: если это так, то это будет ответом на этот вопрос.

В любом случае существуют ли веб-серверы, которые явно поддерживают наличие своего события отрывается от основного потока?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...