Python 任务中的asyncio捕获时间错误

Python 任务中的asyncio捕获时间错误,python,python-3.x,python-asyncio,Python,Python 3.x,Python Asyncio,我有一个asyncio.Task,需要在一段时间后取消。在取消之前,任务需要进行一些清理。根据文档,我应该能够调用task.cancel或asyncio.wait_for(coroutine,delay)并在coroutine中截获asyncio.TimeoutError,但下面的示例不起作用。我尝试截取其他错误,并调用任务。改为取消,但两者都不起作用。我是否误解了取消任务的工作原理 @asyncio.coroutine def toTimeout(): try: i = 0

我有一个
asyncio.Task
,需要在一段时间后取消。在取消之前,任务需要进行一些清理。根据文档,我应该能够调用task.cancel或
asyncio.wait_for(coroutine,delay)
并在coroutine中截获
asyncio.TimeoutError
,但下面的示例不起作用。我尝试截取其他错误,并调用
任务。改为取消
,但两者都不起作用。我是否误解了取消任务的工作原理

@asyncio.coroutine
def toTimeout():
  try:
    i = 0
    while True:
      print("iteration ", i, "......"); i += 1
      yield from asyncio.sleep(1)
  except asyncio.TimeoutError:
    print("timed out")

def main():
  #... do some stuff
  yield from asyncio.wait_for(toTimeout(), 10)
  #... do some more stuff

asyncio.get_event_loop().run_until_complete(main())
asyncio.get_event_loop().run_forever()
指定它将取消基础任务,然后从
wait_for
调用本身中引发
TimeoutError

返回未来或协同程序的结果。当超时发生时,它将 取消任务并引发
asyncio.TimeoutError

您认为任务取消是正确的:

[
Task.cancel
]安排将
canceledError
抛出到包装中 通过事件循环在下一个循环上进行协同路由。那么我们的合作计划呢 有机会清理甚至拒绝使用的请求
尝试
/
除了最后
/
之外

请注意,文档指定将
cancelederror
抛出到协同程序中,而不是
TimeoutError

如果你做出调整,事情就会按你预期的方式进行:

import asyncio

@asyncio.coroutine
def toTimeout():
  try:
    i = 0
    while True:
      print("iteration ", i, "......"); i += 1
      yield from asyncio.sleep(1)
  except asyncio.CancelledError:
    print("timed out")

def main():
  #... do some stuff
  yield from asyncio.wait_for(toTimeout(), 3)
  #... do some more stuff

asyncio.get_event_loop().run_until_complete(main())
输出:

iteration  0 ......
iteration  1 ......
iteration  2 ......
timed out
Traceback (most recent call last):
  File "aio.py", line 18, in <module>
    asyncio.get_event_loop().run_until_complete(main())
  File "/usr/lib/python3.4/asyncio/base_events.py", line 316, in run_until_complete
    return future.result()
  File "/usr/lib/python3.4/asyncio/futures.py", line 275, in result
    raise self._exception
  File "/usr/lib/python3.4/asyncio/tasks.py", line 238, in _step
    result = next(coro)
  File "aio.py", line 15, in main
    yield from asyncio.wait_for(toTimeout(), 3)
  File "/usr/lib/python3.4/asyncio/tasks.py", line 381, in wait_for
    raise futures.TimeoutError()
concurrent.futures._base.TimeoutError
迭代0。。。。。。
迭代1。。。。。。
迭代2。。。。。。
超时
回溯(最近一次呼叫最后一次):
文件“aio.py”,第18行,在
asyncio.get_event_loop()。运行_直到完成(main())
文件“/usr/lib/python3.4/asyncio/base\u events.py”,第316行,运行直到完成
返回future.result()
文件“/usr/lib/python3.4/asyncio/futures.py”,第275行,在结果中
提出自己的意见
文件“/usr/lib/python3.4/asyncio/tasks.py”,第238行,步骤
结果=下一个(coro)
文件“aio.py”,第15行,主
从asyncio.wait_for(toTimeout(),3)中获得的收益
文件“/usr/lib/python3.4/asyncio/tasks.py”,第381行,等待
raisefutures.TimeoutError()
并发.futures.\u base.TimeoutError
如您所见,现在在
wait_for
引发
TimeoutError
之前打印
“超时”