Python 3.4+Асинхронное программированиепонятие
asyncio.Condition
синхронизация
Условная переменная: задача ждёт под замком, пока не выполнится условие, а другая задача меняет состояние и будит ждущих notify() или notify_all().
Синтаксис
cond = asyncio.Condition()
async with cond: await cond.wait_for(predicate)
И wait(), и notify() разрешены только внутри async with cond, иначе RuntimeError. Проснувшаяся задача не знает, что условие выполнено, — её могли разбудить, а состояние успели изменить снова, поэтому вместо if с wait() пишут цикл или сразу await cond.wait_for(предикат). Если ждут только «событие случилось», проще asyncio.Event; если очередь данных — asyncio.Queue.
Примеры
import asyncio
items = []
async def consumer(cond):
async with cond:
await cond.wait_for(lambda: len(items) >= 2)
print('получено', items) # → получено [1, 2]
async def main():
cond = asyncio.Condition()
task = asyncio.create_task(consumer(cond))
for x in (1, 2):
await asyncio.sleep(0.01)
async with cond:
items.append(x)
cond.notify_all()
await task
asyncio.run(main())
import asyncio
async def main():
cond = asyncio.Condition()
try:
cond.notify()
except RuntimeError as e:
print(e) # → cannot notify on un-acquired lock
await asyncio.sleep(0.01)
asyncio.run(main())
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности