Python 如何使用Pulsar HttpClient和Tornado捕获超时错误

Python 如何使用Pulsar HttpClient和Tornado捕获超时错误,python,tornado,python-asyncio,python-pulsar,Python,Tornado,Python Asyncio,Python Pulsar,我正在用Tornado编写一个应用程序。我需要发出很多HTTP请求,但Tornado的HTTP客户端有点糟糕(没有保持活动的支持,速度很慢),所以我尝试使用Pulsar HttpClient: import tornado.web import tornado.gen import tornado.httpserver from tornado.platform.asyncio import AsyncIOMainLoop from tornado.platform import asyncio

我正在用Tornado编写一个应用程序。我需要发出很多HTTP请求,但Tornado的HTTP客户端有点糟糕(没有保持活动的支持,速度很慢),所以我尝试使用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()
Bun发生超时时,我得到一个异常:

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
回溯(最近一次呼叫最后一次):
文件“/home/vitaliy/.virtualenvs/tornado/local/lib/python3.4/site packages/tornado/web.py”,第1415行,在
结果=产量结果
文件“/home/vitaliy/.virtualenvs/tornado/local/lib/python3.4/site packages/tornado/gen.py”,第870行,运行中
value=future.result()
文件“/home/vitaliy/.virtualenvs/tornado/local/lib/python3.4/site packages/tornado/concurrent.py”,第215行,结果
提升exc信息(自身exc信息)
文件“”,第3行,在raise_exc_信息中
文件“/home/vitaliy/.virtualenvs/tornado/local/lib/python3.4/site packages/tornado/gen.py”,第876行,运行中
屈服=自我生成抛出(*exc_信息)
get中第19行的文件“bpp.py”
结果=未来收益率
文件“/home/vitaliy/.virtualenvs/tornado/local/lib/python3.4/site packages/tornado/gen.py”,第870行,运行中
value=future.result()
文件“/home/vitaliy/.virtualenvs/tornado/local/lib/python3.4/site packages/tornado/concurrent.py”,第215行,结果
提升exc信息(自身exc信息)
文件“”,第3行,在raise_exc_信息中
文件“/usr/lib/python3.4/asyncio/tasks.py”,第300行,步骤
结果=coro.send(值)
文件“/usr/lib/python3.4/asyncio/tasks.py”,第436行,等待
raisefutures.TimeoutError()
并发.futures.\u base.TimeoutError

我能以某种方式捕获此异常吗?

只需将该错误导入代码:

from concurrent.futures import TimeoutError

否则您将无法捕获它

您从何处导入TimeoutError?看起来它没有导入。您是否尝试过并发导入的
。期货导入时间错误
?@not_a_高尔夫球手,哦,谢谢,它可以!。起初我认为它与内置的TimeoutError是一样的。事实证明,它不是。维塔利转换成一个答案。。。