Python asyncio condition 中 wait_for 方法的简单使用

Posted ketchum

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python asyncio condition 中 wait_for 方法的简单使用相关的知识,希望对你有一定的参考价值。

python asyncio condition中有个方法叫wait_for,该方法接受一个不带参数且返回值为布尔类型函数。没执行一次con.notify_all()操作。wait_for中的函数便执行一次判断,直至其结果为true.

测试代码:
import asyncio
def judge()->bool:

print(" in func judge ")
return False

async def task_1(con:asyncio.Condition)->None:

await asyncio.sleep(1)
while True:
    async with con:
        con.notify_all()
        print("notify")
    await asyncio.sleep(2)

async def task_2(con:asyncio.Condition)->None:

print("in task_2")
async with con:
    await con.wait_for(judge)

async def main():

try:
    con = asyncio.Condition()
    t1 = asyncio.create_task(task_1(con))
    t2 = asyncio.create_task(task_2(con))
    await t1
    await t2
except:
    pass

try:

asyncio.run(main())

except:

pass

结果如下:

in task_2
in func judge
notify
in func judge
notify
in func judge

 
我们创建了两个task,其中一个当作触发器con.notify_all()。另外一个当作被触发await con.wait_for(judge)。wait_for 函数必须提供一个不带参数且返回值为布尔类型函数。    
task_1中有await asyncio.sleep(1)函数是为了让task_2先执行。task_2会先执行一次判断,所以结果中会有
in task_2
in func judge 

信息输出。后续task_1每执行一次con.notify_all()操作,await con.wait_for(judge)中的judge函数会执行一次判断。

async with con: # 获取锁
await con.wait_for(judge) #先释放锁,等待notify_all()函数触发。触发后立即获取锁,随后 judge函数执行。然后接着释放锁,继续等待notify_all()函数触发

wait_for 源码如下:

async def wait_for(self, predicate):
    """Wait until a predicate becomes true.

    The predicate should be a callable which result will be
    interpreted as a boolean value.  The final predicate value is
    the return value.
    """
    result = predicate()
    while not result:
        await self.wait()
        result = predicate()
    return result

self.wait()方法中总是先释放锁,等待notify_all()的触发,随后获取锁,然后执行predicate()函数

以上是关于Python asyncio condition 中 wait_for 方法的简单使用的主要内容,如果未能解决你的问题,请参考以下文章

Python协程之asyncio

python:asyncio模块

Python asyncio 模块

python asyncio

Python标准模块--asyncio

Python学习---Python的异步---asyncio模块(no-http)