Python Glossary English

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Сообщить о неточности