Python Asyncio - Pythonic способ ожидания выполнения условия

Мне нужно подождать, пока определенное условие/уравнение не станет истинным в асинхронной функции в python. По сути, это переменная флага, которая будет помечена сопрограммой, работающей в asyncio.create_task(). Я хочу дождаться, пока он не будет помечен в основном цикле asyncio. Вот мой текущий код:

import asyncio
flag = False

async def bg_tsk():
    await asyncio.sleep(10)
    flag = True

async def waiter():
    asyncio.create_task(bg_tsk())
    await asyncio.sleep(0)
    # I find the below part unpythonic
    while not flag:
        await asyncio.sleep(0.2)

asyncio.run(waiter())

Есть ли лучшая реализация этого? Или это лучший из возможных способов? Я пытался использовать asyncio.Event, но, похоже, он не работает с asyncio.create_task().

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
6
0
3 773
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Использование asyncio.Event довольно просто. Образец ниже.

Примечание: для корректной работы событие должно быть создано внутри сопрограммы.

import asyncio


async def bg_tsk(flag):
    await asyncio.sleep(3)
    flag.set()


async def waiter():
    flag = asyncio.Event()
    asyncio.create_task(bg_tsk(flag))
    await flag.wait()
    print("After waiting")


asyncio.run(waiter())

Я думаю, что asyncio.sleep(0) здесь бесполезен, или я что-то упускаю?

Rémi Desgrange 18.12.2020 08:37

На самом деле await asyncio.sleep(0) гарантирует, что элемент управления переходит к create_task для его немедленного запуска. Если не используется, задача запустится только после того, как программа встретится где-то еще. Но спасибо, это работает... Мне просто нужно попробовать проверить, будет ли работать передача списка событий....

cyberGhoul 18.12.2020 10:47

@cyberGhoul Обратите внимание, что await будет встречен сразу же, потому что вы будете ждать флага. asyncio.sleep(0) требуется очень редко, и его использование обычно указывает на архитектурную или дизайнерскую проблему с кодом.

user4815162342 18.12.2020 15:57

Что делать, если у вас нет контроля над запуском функции, которую вы хотите дождаться?

John Glen 30.08.2022 14:47

Другие вопросы по теме