-
-
Notifications
You must be signed in to change notification settings - Fork 2.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
unexpected asyncio.exceptions.CancelledError #5851
Comments
Minimal example: import asyncio
import aiohttp
import traceback
async def main():
async with aiohttp.ClientSession() as client:
try:
async with client.get('http://127.0.0.1:8080/', timeout=1) as r:
async for data in r.content.iter_chunked(8192):
await asyncio.sleep(0.01)
except asyncio.exceptions.TimeoutError:
print(traceback.format_exc())
print("TIMEOUT")
await asyncio.sleep(5)
asyncio.run(main()) The code is very timing dependent. The reason for this depends on whether the timeout happens before or during the timer's I'm not really sure what the idea is behind cancelling the current task (in addition to raising a |
(Note this depends on and extends #5853) When reading in a loop while the buffer is being constantly filled, the timeout does not work as there are no calls to `_wait()` where the timer is used. I don't know if this edge case is enough to be worried about, but have put together an initial attempt at fixing it. I'm not sure if this is really the right solution, but can atleast be used as as a discussion on ways to improve this. This can't be backported as this changes the public API (one of the functions is now async). Related #5851. --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
(Note this depends on and extends #5853) When reading in a loop while the buffer is being constantly filled, the timeout does not work as there are no calls to `_wait()` where the timer is used. I don't know if this edge case is enough to be worried about, but have put together an initial attempt at fixing it. I'm not sure if this is really the right solution, but can atleast be used as as a discussion on ways to improve this. This can't be backported as this changes the public API (one of the functions is now async). Related #5851. --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> (cherry picked from commit 80e2bde)
(Note this depends on and extends #5853) When reading in a loop while the buffer is being constantly filled, the timeout does not work as there are no calls to `_wait()` where the timer is used. I don't know if this edge case is enough to be worried about, but have put together an initial attempt at fixing it. I'm not sure if this is really the right solution, but can atleast be used as as a discussion on ways to improve this. This can't be backported as this changes the public API (one of the functions is now async). Related #5851. --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> (cherry picked from commit 80e2bde) <!-- Thank you for your contribution! --> ## What do these changes do? <!-- Please give a short brief about these changes. --> ## Are there changes in behavior for the user? <!-- Outline any notable behaviour for the end users. --> ## Related issue number <!-- Are there any issues opened that will be resolved by merging this change? --> ## Checklist - [ ] I think the code is well written - [ ] Unit tests for the changes exist - [ ] Documentation reflects the changes - [ ] If you provide code modification, please add yourself to `CONTRIBUTORS.txt` * The format is <Name> <Surname>. * Please keep alphabetical order, the file is sorted by names. - [ ] Add a new news fragment into the `CHANGES` folder * name it `<issue_id>.<type>` for example (588.bugfix) * if you don't have an `issue_id` change it to the pr id after creating the pr * ensure type is one of the following: * `.feature`: Signifying a new feature. * `.bugfix`: Signifying a bug fix. * `.doc`: Signifying a documentation improvement. * `.removal`: Signifying a deprecation or removal of public API. * `.misc`: A ticket has been closed, but it is not of interest to users. * Make sure to use full sentences with correct case and punctuation, for example: "Fix issue with non-ascii contents in doctest text files."
Describe the bug
Sometimes after raising
asyncio.exceptions.TimeoutError
next awaits of coroutines causesasyncio.exceptions.CancelledError
To Reproduce
Emulate server with random timeouts
and a client that "downloads files" in parallel
Expected behavior
await asyncio.sleep() in TimeoutError handler should not throw
asyncio.exceptions.CancelledError
, because no one cancels this coroutine. We should never seeALARM
in output.Logs/tracebacks
Python Version
aiohttp Version
multidict Version
yarl Version
OS
Win10x64 (1909)
Centos 8
Related component
Client
Additional context
I'm not sure if this is a aiohttp issue, because if remove
await ...
fromasync for
-scope, then the side effect magically disappears, but I already excludedaiorun
andaiofiles
and it's time foraiohttp
Code of Conduct
The text was updated successfully, but these errors were encountered: