【问题标题】:Python Asyncio - Pythonic way of waiting until condition satisfiedPython Asyncio - 等待条件满足的 Pythonic 方式
【发布时间】:2020-12-18 06:32:49
【问题描述】:

我需要等到某个条件/方程式在 python 的异步函数中变为 True。 基本上它是一个标志变量,将由运行在 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 python-3.x python-asyncio


    【解决方案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)在这里没用,还是我遗漏了什么?
    • 实际上 await asyncio.sleep(0) 确保控件转到 create_task 以立即启动它。如果不使用,则只有在程序在其他地方遇到 await 后才会启动任务。但是谢谢这个工作......我只需要尝试检查传递事件列表是否会工作......
    • @cyberGhoul 请注意,await 将立即遇到,因为您将等待标志。 asyncio.sleep(0) 很少需要,它的使用通常表明代码存在架构或设计问题。
    猜你喜欢
    • 2020-11-17
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多