Message382732
This is something I've been procrastinating on for almost a year and working around it using my own version of asyncio.Condition because I wasn't sure how to describe it. So here's my best take:
Consider the following code:
```
import asyncio
async def tf(con):
async with con:
await asyncio.wait_for(con.wait(), 60)
async def f(loop):
con = asyncio.Condition()
t = loop.create_task(tf(con))
await asyncio.sleep(1)
t.cancel()
async with con:
con.notify_all()
await t
loop = asyncio.get_event_loop()
loop.run_until_complete(f(loop))
```
(I'm using old-school APIs because I wanted to verify whether it was a regression. I ran into the bug with new-style APIs: https://gist.github.com/hynek/387f44672722171c901b8422320e8f9b)
`await t` will crash with:
```
Traceback (most recent call last):
File "/Users/hynek/t.py", line 6, in tf
await asyncio.wait_for(con.wait(), 60)
File "/Users/hynek/.asdf/installs/python/3.9.0/lib/python3.9/asyncio/tasks.py", line 466, in wait_for
await waiter
asyncio.exceptions.CancelledError
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/hynek/t.py", line 24, in <module>
loop.run_until_complete(f(loop))
File "/Users/hynek/.asdf/installs/python/3.9.0/lib/python3.9/asyncio/base_events.py", line 642, in run_until_complete
return future.result()
File "/Users/hynek/t.py", line 20, in f
await t
File "/Users/hynek/t.py", line 6, in tf
await asyncio.wait_for(con.wait(), 60)
File "/Users/hynek/.asdf/installs/python/3.9.0/lib/python3.9/asyncio/locks.py", line 20, in __aexit__
self.release()
File "/Users/hynek/.asdf/installs/python/3.9.0/lib/python3.9/asyncio/locks.py", line 146, in release
raise RuntimeError('Lock is not acquired.')
RuntimeError: Lock is not acquired.
```
If you replace wait_for with a simple await, it works and raises an asyncio.exceptions.CancelledError:
```
Traceback (most recent call last):
File "/Users/hynek/t.py", line 6, in tf
await con.wait()
File "/Users/hynek/.asdf/installs/python/3.9.0/lib/python3.9/asyncio/locks.py", line 290, in wait
await fut
asyncio.exceptions.CancelledError
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/hynek/t.py", line 20, in f
await t
asyncio.exceptions.CancelledError
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/Users/hynek/t.py", line 24, in <module>
loop.run_until_complete(f(loop))
File "/Users/hynek/.asdf/installs/python/3.9.0/lib/python3.9/asyncio/base_events.py", line 642, in run_until_complete
return future.result()
asyncio.exceptions.CancelledError
```
I have verified, that this has been broken at least since 3.5.10. The current 3.10.0a3 is affected too. |
|
Date |
User |
Action |
Args |
2020-12-08 12:35:56 | hynek | set | recipients:
+ hynek, asvetlov, lukasz.langa, yselivanov |
2020-12-08 12:35:56 | hynek | set | messageid: <1607430956.17.0.934441920245.issue42600@roundup.psfhosted.org> |
2020-12-08 12:35:56 | hynek | link | issue42600 messages |
2020-12-08 12:35:55 | hynek | create | |
|