Правильно реагировать на состояние ожидания из другого контекста - PullRequest
1 голос
/ 07 июля 2019

Если я использую uvloop или asyncio, одна из возможностей, которую я пытаюсь изучить, - это если я выполняю какие-то действия и затем "жду условия".

Давайте рассмотрим следующий пример:

do_something()
zmq.send(stuff,coroutine_context)
rr = await (condition)
return rr

тогда какой-то другой процесс выполняет какую-то работу.

тогда сопрограмма по этому процессу имеет:

rval = zmq.recv()
look at rval and get coroutine_context.
notify (condition) pass in rval.

Теперь я знаю, что могу использовать что-то вроде условной переменной, но для этого требуется какая-то блокировка. Меня не волнует доступ нескольких людей к этой сопрограмме, поэтому я не хочу ничего блокировать. Я просто хочу уведомить () этот контекст с некоторыми данными в этой другой сопрограмме (сопрограмма zmq), чтобы вернуться к некоторому элементу.

Ключом здесь является извлечение контекста сопрограммы (некоторый идентификатор), чтобы затем уведомить команду await и передать этот элемент rval.

есть идеи, как сделать это эффективно без блокировок?

1 Ответ

0 голосов
/ 09 июля 2019

Это можно реализовать с помощью asyncio.Event. Создайте событие и передайте его как функции, которая должна уведомить, так и функции, которая должна ждать.

Ожидающая сторона должна await event.wait(). Уведомляющая сторона должна позвонить event.set(). Это предполагает, что обе стороны используют asyncio, а не потоки. Если уведомитель выполняется в другом потоке, он должен вызвать loop.call_soon_threadsafe(event.set).

...