Python AsyncHttpClient внутри торнадо RequestHandler выдает исключение - PullRequest
0 голосов
/ 30 января 2019

Я собираюсь вызвать конечную точку с помощью торнадо AsyncHttpClient в RequestHandler, но он выдает исключение времени выполнения This event loop is already running

class RegistrationHandler(tornado.web.RequestHandler):

  def post(self, *args, **kwargs):
      call_async_register("some params")


def call_async_register(parameters):
    def call():
        http_client = AsyncHTTPClient()
        future = Future()
        http_request = HTTPRequest(url, request_type.name, headers={'X-Peering': '1'}, body=body)

        def handle_future(f: Future):
            future.set_result(f.result())

        fetched_future = http_client.fetch(http_request)

        fetched_future.add_done_callback(handle_future)

        return future
    try:
        instance = io_loop.IOLoop.current()
        response = instance.run_sync(call)
        return response.body.decode()
    except Exception as err:
        self.logger.exception("Account Request Failed: {}".format(err))
        return None

1 Ответ

0 голосов
/ 30 января 2019

Вот проблема:

instance = io_loop.IOLoop.current()
response = instance.run_sync(call)

run_sync сам пытается запустить ioloop.Но, как видно из вашего кода, instance уже запущен.Таким образом, вы получаете ошибку.

Если вы хотите отправить значение, возвращенное методом call(), обратно пользователю, преобразуйте ваши методы в сопрограммы (используйте синтаксис async/await).

Пример:

class RegistrationHandler(tornado.web.RequestHandler):

    async def post(self, *args, **kwargs):
        response = await call_async_register("some params")

        self.write(response)


async def call_async_register(parameters):
    http_client = AsyncHTTPClient()
    http_request = HTTPRequest(url, request_type.name, headers={'X-Peering': '1'}, body=body)

    try:
        response = await http_client.fetch(http_request)
        return response.body.decode()
    except Exception as err:
        self.logger.exception("Account Request Failed: {}".format(err))
        return None
...