Asyncio wait_for that can handle simultaneous cancellation and future completion.
Project description
wait_for2
Alternate implementation of asyncio.wait_for()
based on the version from Python 3.8. It handles simultaneous
cancellation of wait and completion of future differently and consistently across Python versions 3.6+.
Details
Builtin asyncio.wait_for()
behaviours:
- Python 3.6 and 3.7:
Cancellation of
wait_for
could lose the completed future's result. - Python 3.8+ and PyPy3:
Cancellation of
wait_for
could lose the cancellation request.
Whenever waiting for a future's result the user expects to either have the future completed or cancelled.
Unfortunately due to technical details there is a chance that both will happen simultaneously. The builtin version
of asyncio.wait_for()
shipped with Python either handles one or the other only. If losing the future's result or
ignoring the cancellation is critical to the application it may not be suitable for use.
Using this implementation, in case both conditions occur at the same time a subclassed CancelledError
will be
raised which also contains the result of the future. The caller code must catch this exception and handle the
result if it is important. Otherwise it can be used the same way as the builtin wait_for
.
NOTE: CancelledWithResultError
is limited to the coroutine wait_for
is invoked from!
If this wait_for
is wrapped in tasks those will not propagate the special exception, but raise their own
CancelledError
instances.
Install & usage
A source distribution is available on PyPI:
$ python -m pip install wait_for2
import asyncio
import wait_for2
task = asyncio.create_task(...)
async def process_result(r):
print("processed:", r)
...
try:
await process_result(await wait_for2.wait_for(task, 5.0))
except wait_for2.CancelledWithResultError as e:
# NOTE: e.result could be an exception raised by the task; handling or ignoring it is up to the user code here
await process_result(e.result)
raise asyncio.CancelledError()
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for wait_for2-0.1.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c087392c92e8f702a9243a5c7be9032feb4f169c30786f46afb0546929e8801d |
|
MD5 | 8ea0f5fd2201f6c89214fc3982d99d86 |
|
BLAKE2b-256 | f1ca8e4292682de3c8ac92f911a456de973b4c9d64da4b077bfef1d9f74b8957 |