Message369278
In https://bugs.python.org/issue40607 asyncio.wait_for behavior was changed so it propagates exceptions that happened during cancellation. But it still raises `TimeoutError` if cancelation ends with some value being returned. In the following example value `42` is lost:
import asyncio
async def return_42_on_cancel():
try:
await asyncio.sleep(20)
except asyncio.CancelledError:
return 42 # `return` is useless in this block.
async def main():
try:
await asyncio.wait_for(return_42_on_cancel(), timeout=1)
except asyncio.TimeoutError:
print('Timeout')
asyncio.run(main())
I think it's better to either:
1) Return that value from `asyncio.wait_for`.
The motivation here is that if the task returns something, we shouldn't conceal it. I also searched through GitHub and found some places where others catch `CancelledError` and return value (https://github.com/grpc/grpc/blob/44fb37c99f2853cc23f04fba15468980d9e28e41/src/python/grpcio/grpc/experimental/aio/_interceptor.py#L328).
It can also be used with some coroutines developed to be wrapped with `wait_for`, for example suppose the following equation solving function:
async def solve_iteratively(initial_x, next_approximation):
result = initial_x
try:
while True:
result = next_approximation(result)
await asyncio.sleep(0)
except asyncio.CancelledError:
return result
It allows us to control its execution time using asyncio.wait_for.
2) Add some warning about the value is thrown away (in debug mode) and document it somewhere.
===
I am a newbie here, so sorry if it is wrong to create such "proposal" issues. |
|
Date |
User |
Action |
Args |
2020-05-18 17:23:20 | Roman Skurikhin | set | recipients:
+ Roman Skurikhin, asvetlov, yselivanov |
2020-05-18 17:23:20 | Roman Skurikhin | set | messageid: <1589822600.1.0.30867318872.issue40672@roundup.psfhosted.org> |
2020-05-18 17:23:20 | Roman Skurikhin | link | issue40672 messages |
2020-05-18 17:23:19 | Roman Skurikhin | create | |
|