Message299845
In Python 3.6.1, if asyncio.wait_for() times out with a TimeoutError, the traceback doesn't show what line the code was waiting on when the timeout occurred. This makes it more difficult to diagnose the cause of a timeout.
To reproduce, you can use the following code:
import asyncio
async def run():
print('running...')
await asyncio.sleep(1000000)
def main(coro):
loop = asyncio.new_event_loop()
future = asyncio.wait_for(coro, timeout=1)
loop.run_until_complete(future)
main(run())
It gives the following output (notice that the sleep() line is missing):
$ python test-timeouterror.py
running...
Traceback (most recent call last):
File "test-timeouterror.py", line 12, in <module>
main(run())
File "test-timeouterror.py", line 10, in main
loop.run_until_complete(future)
File "/Users/.../python3.6/asyncio/base_events.py", line 466,
in run_until_complete
return future.result()
File "/Users/.../python3.6/asyncio/tasks.py", line 356, in wait_for
raise futures.TimeoutError()
concurrent.futures._base.TimeoutError
It seems like it should be possible to show the full traceback because, for example, if I register a signal handler with loop.add_signal_handler() as described here:
https://mail.python.org/pipermail/async-sig/2017-August/000374.html
and press Control-C before the timeout occurs, I do get a full traceback showing the line:
await asyncio.sleep(1000000) |
|
Date |
User |
Action |
Args |
2017-08-07 11:06:35 | chris.jerdonek | set | recipients:
+ chris.jerdonek, yselivanov |
2017-08-07 11:06:35 | chris.jerdonek | set | messageid: <1502103995.24.0.900898482206.issue31131@psf.upfronthosting.co.za> |
2017-08-07 11:06:35 | chris.jerdonek | link | issue31131 messages |
2017-08-07 11:06:34 | chris.jerdonek | create | |
|