the document about asyncio.Condition
is kind of misleading.
the doc says:
An asyncio condition primitive can be used by a task to wait for some event to happen and then get exclusive access to a shared resource.
but in the example code
cond = asyncio.Condition()
# ... later
async with cond:
await cond.wait()
it’s more like we acquire the lock first, then we wait on the event.