Python 如何使用Pulsar HttpClient和Tornado捕获超时错误
我正在用Tornado编写一个应用程序。我需要发出很多HTTP请求,但Tornado的HTTP客户端有点糟糕(没有保持活动的支持,速度很慢),所以我尝试使用Pulsar HttpClient: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
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是一样的。事实证明,它不是。维塔利转换成一个答案。。。