Mailing List Archive

[issue42130] AsyncIO's wait_for can hide cancellation in a rare race condition
New submission from Taras Voinarovskyi <voyn1991@gmail.com>:

Hi, during migration to Python 3.8.6 we encountered a behavior change from previous versions: wait_for ignored the request to cancellation and returned instead. After investigation, it seems to be related to the update in bpo-32751 and is only reproduced if the waited task is finished when cancellation of wait_for happens (code mistakes external CancelledError for a timeout).

The following example can reproduce the behavior on both 3.8.6 and 3.9.0 for me:

```

import asyncio


async def inner():
return

async def with_for_coro():
await asyncio.wait_for(inner(), timeout=100)
await asyncio.sleep(1)
print('End of with_for_coro. Should not be reached!')

async def main():
task = asyncio.create_task(with_for_coro())
await asyncio.sleep(0)
assert not task.done()
task.cancel()
print('Called task.cancel()')
await task # -> You would expect a CancelledError to be raised.


asyncio.run(main())
```

Changing the wait time before cancellation slightly will return the correct behavior and CancelledError will be raised.

----------
components: asyncio
messages: 379454
nosy: asvetlov, tvoinarovskyi, yselivanov
priority: normal
severity: normal
status: open
title: AsyncIO's wait_for can hide cancellation in a rare race condition
type: behavior
versions: Python 3.10, Python 3.8, Python 3.9

_______________________________________
Python tracker <report@bugs.python.org>
<https://bugs.python.org/issue42130>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/list-python-bugs%40lists.gossamer-threads.com
[issue42130] AsyncIO's wait_for can hide cancellation in a rare race condition [ In reply to ]
Change by Chris Jerdonek <chris.jerdonek@gmail.com>:


----------
nosy: +chris.jerdonek

_______________________________________
Python tracker <report@bugs.python.org>
<https://bugs.python.org/issue42130>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/list-python-bugs%40lists.gossamer-threads.com
[issue42130] AsyncIO's wait_for can hide cancellation in a rare race condition [ In reply to ]
Chris Jerdonek <chris.jerdonek@gmail.com> added the comment:

It looks like issue 37658 might be the relevant change rather.

Here is the new logic it introduced: https://github.com/python/cpython/blob/db455296be5f792b8c12b7cd7f3962b52e4f44ee/Lib/asyncio/tasks.py#L483-L488

(via https://github.com/python/cpython/pull/21894 )

----------

_______________________________________
Python tracker <report@bugs.python.org>
<https://bugs.python.org/issue42130>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/list-python-bugs%40lists.gossamer-threads.com
[issue42130] AsyncIO's wait_for can hide cancellation in a rare race condition [ In reply to ]
Taras Voinarovskyi <voyn1991@gmail.com> added the comment:

Hi Chris,
Yes, I do believe that is the respectful change, if we look the CancelledError is not checked to be external or originate from the timer.
Best regards,
Taras Voinarovskyi

----------

_______________________________________
Python tracker <report@bugs.python.org>
<https://bugs.python.org/issue42130>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/list-python-bugs%40lists.gossamer-threads.com
[issue42130] AsyncIO's wait_for can hide cancellation in a rare race condition [ In reply to ]
Change by Denis S. Otkidach <denis.otkidach@gmail.com>:


----------
nosy: +ods

_______________________________________
Python tracker <report@bugs.python.org>
<https://bugs.python.org/issue42130>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/list-python-bugs%40lists.gossamer-threads.com