Staging
v0.5.1
https://github.com/python/cpython
Revision d8948c5e09c4a2a818f6f6cfaf8064f2c2138fa5 authored by Miss Islington (bot) on 29 May 2018, 22:37:06 UTC, committed by GitHub on 29 May 2018, 22:37:06 UTC

Currently, asyncio.wait_for(fut), upon reaching the timeout deadline,
cancels the future and returns immediately.  This is problematic for
when *fut* is a Task, because it will be left running for an arbitrary
amount of time.  This behavior is iself surprising and may lead to
related bugs such as the one described in bpo-33638:

    condition = asyncio.Condition()
    async with condition:
        await asyncio.wait_for(condition.wait(), timeout=0.5)

Currently, instead of raising a TimeoutError, the above code will fail
with `RuntimeError: cannot wait on un-acquired lock`, because
`__aexit__` is reached _before_ `condition.wait()` finishes its
cancellation and re-acquires the condition lock.

To resolve this, make `wait_for` await for the task cancellation.
The tradeoff here is that the `timeout` promise may be broken if the
task decides to handle its cancellation in a slow way.  This represents
a behavior change and should probably not be back-patched to 3.6 and
earlier.
(cherry picked from commit e2b340ab4196e1beb902327f503574b5d7369185)

Co-authored-by: Elvis Pranskevichus <elvis@magic.io>
1 parent 0364342
History
Tip revision: d8948c5e09c4a2a818f6f6cfaf8064f2c2138fa5 authored by Miss Islington (bot) on 29 May 2018, 22:37:06 UTC
bpo-32751: Wait for task cancellation in asyncio.wait_for() (GH-7216)
Tip revision: d8948c5
File Mode Size
bdist_wininst
clinic
external
icons
WinMain.c -rw-r--r-- 449 bytes
_findvs.cpp -rw-r--r-- 6.5 KB
_msi.c -rw-r--r-- 32.1 KB
_testconsole.c -rw-r--r-- 3.3 KB
config.c -rw-r--r-- 5.3 KB
dl_nt.c -rw-r--r-- 4.6 KB
empty.c -rw-r--r-- 137 bytes
errmap.h -rw-r--r-- 2.1 KB
errmap.mak -rw-r--r-- 95 bytes
frozen_dllmain.c -rw-r--r-- 3.9 KB
generrmap.c -rw-r--r-- 849 bytes
getpathp.c -rw-r--r-- 31.7 KB
invalid_parameter_handler.c -rw-r--r-- 549 bytes
launcher.c -rw-r--r-- 53.6 KB
msvcrtmodule.c -rw-r--r-- 15.3 KB
pyconfig.h -rw-r--r-- 19.9 KB
pylauncher.rc -rw-r--r-- 1.4 KB
pyshellext.cpp -rw-r--r-- 18.1 KB
pyshellext.def -rw-r--r-- 141 bytes
pyshellext.idl -rw-r--r-- 277 bytes
pyshellext.rc -rw-r--r-- 1.1 KB
pyshellext_d.def -rw-r--r-- 143 bytes
python.manifest -rw-r--r-- 1.3 KB
python3.def -rw-r--r-- 40.5 KB
python3dll.c -rw-r--r-- 134 bytes
python_exe.rc -rw-r--r-- 1.2 KB
python_nt.rc -rw-r--r-- 1.2 KB
python_ver_rc.h -rw-r--r-- 970 bytes
pythonw_exe.rc -rw-r--r-- 1.2 KB
readme.txt -rw-r--r-- 3.5 KB
sqlite3.rc -rw-r--r-- 1.3 KB
testpy.py -rw-r--r-- 831 bytes
validate_ucrtbase.py -rw-r--r-- 2.7 KB
winreg.c -rw-r--r-- 59.7 KB
winsound.c -rw-r--r-- 6.5 KB

readme.txt

back to top