Как отловить TimeoutError с помощью Pulsar HttpClient с Tornado

Я пишу приложение, используя Торнадо. Мне нужно сделать много HTTP-запросов, но HTTP-клиент Tornado немного отстой (не поддерживает Keep-Alive и работает медленно), поэтому я пытаюсь использовать Pulsar HttpClient:

import tornado.web
import tornado.gen
import tornado.httpserver
from tornado.platform.asyncio import AsyncIOMainLoop
from tornado.platform import asyncio as tornasync
import asyncio
from pulsar.apps import http as pulsar_http


class MyHandler(tornado.web.RequestHandler):

    @tornado.gen.coroutine
    def get(self):
        http_client = self.application.http_client

        future = tornasync.to_tornado_future(asyncio.async(http_client.request('GET', 'http://httpbin.org', timeout=.25)))
        try:
            result = yield future
        except TimeoutError as e:
            print('Timeout!')

        print(result.get_content())

        self.write('OK')
        self.finish()


if __name__ == '__main__':
    AsyncIOMainLoop().install()

    app = tornado.web.Application([(r'/', MyHandler)], debug=False)
    server = tornado.httpserver.HTTPServer(app)
    server.bind(8888)
    server.start(1)

    app.http_client = pulsar_http.HttpClient(loop=asyncio.get_event_loop())

    asyncio.get_event_loop().run_forever()

Булочка, когда происходит тайм-аут, я получаю исключение:

Traceback (most recent call last):
  File "/home/vitaliy/.virtualenvs/tornado/local/lib/python3.4/site-packages/tornado/web.py", line 1415, in _execute
    result = yield result
  File "/home/vitaliy/.virtualenvs/tornado/local/lib/python3.4/site-packages/tornado/gen.py", line 870, in run
    value = future.result()
  File "/home/vitaliy/.virtualenvs/tornado/local/lib/python3.4/site-packages/tornado/concurrent.py", line 215, in result
    raise_exc_info(self._exc_info)
  File "<string>", line 3, in raise_exc_info
  File "/home/vitaliy/.virtualenvs/tornado/local/lib/python3.4/site-packages/tornado/gen.py", line 876, in run
    yielded = self.gen.throw(*exc_info)
  File "bpp.py", line 19, in get
    result = yield future
  File "/home/vitaliy/.virtualenvs/tornado/local/lib/python3.4/site-packages/tornado/gen.py", line 870, in run
    value = future.result()
  File "/home/vitaliy/.virtualenvs/tornado/local/lib/python3.4/site-packages/tornado/concurrent.py", line 215, in result
    raise_exc_info(self._exc_info)
  File "<string>", line 3, in raise_exc_info
  File "/usr/lib/python3.4/asyncio/tasks.py", line 300, in _step
    result = coro.send(value)
  File "/usr/lib/python3.4/asyncio/tasks.py", line 436, in wait_for
    raise futures.TimeoutError()
concurrent.futures._base.TimeoutError

Могу ли я поймать это исключение как-нибудь?

1 ответ

Решение

Просто импортируйте эту ошибку в ваш код:

from concurrent.futures import TimeoutError

В противном случае вы не можете поймать это

Другие вопросы по тегам