Мне нужно подождать, пока определенное условие/уравнение не станет истинным в асинхронной функции в 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().






Использование 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())
На самом деле await asyncio.sleep(0) гарантирует, что элемент управления переходит к create_task для его немедленного запуска. Если не используется, задача запустится только после того, как программа встретится где-то еще. Но спасибо, это работает... Мне просто нужно попробовать проверить, будет ли работать передача списка событий....
@cyberGhoul Обратите внимание, что await будет встречен сразу же, потому что вы будете ждать флага. asyncio.sleep(0) требуется очень редко, и его использование обычно указывает на архитектурную или дизайнерскую проблему с кодом.
Что делать, если у вас нет контроля над запуском функции, которую вы хотите дождаться?
Я думаю, что
asyncio.sleep(0)здесь бесполезен, или я что-то упускаю?