[New-bugs-announce] [issue40672] asyncio.wait_for: process future result produced during cancelation

Roman Skurikhin report at bugs.python.org
Mon May 18 13:23:20 EDT 2020


New submission from Roman Skurikhin <romasku135 at gmail.com>:

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.

----------
components: asyncio
messages: 369278
nosy: Roman Skurikhin, asvetlov, yselivanov
priority: normal
severity: normal
status: open
title: asyncio.wait_for: process future result produced during cancelation
type: enhancement
versions: Python 3.9

_______________________________________
Python tracker <report at bugs.python.org>
<https://bugs.python.org/issue40672>
_______________________________________


More information about the New-bugs-announce mailing list