pythonasynciocondition中有一个方法叫做wait_for,它接受一个没有参数的函数,返回一个布尔类型。不会执行一次con.notify_all()操作。wait_for中的函数执行判断,直到结果为真。测试代码:importasynciodefjudge()->bool:print("infuncjudge")returnFalseasyncdeftask_1(con:asyncio.Condition)->None:awaitasyncio.sleep(1)whileTrue:asyncwithcon:con.notify_all()print("notify")awaitasyncio.sleep(2)asyncdeftask_2(con:asyncio.Condition)->None:print("intask_2")asyncwithcon:awaitcon.wait_for(judge)asyncdefmain():try:con=asyncio.Condition()t1=asyncio.create_task(task_1(con))t2=asyncio.create_task(task_2(con))等待t1awaitt2except:passtry:asyncio.run(main())except:pass结果如下:在task_2中funcjudgenotify在funcjudgenotify在funcjudge我们创建了两个任务,其中一个作为触发器con。通知所有()。另一个被触发为awaitcon.wait_for(judge)。wait_for函数必须提供一个不带参数并返回布尔值的函数。task_1中的awaitasyncio.sleep(1)函数就是让task_2先执行。task_2会先执行一个判断,所以结果中会有task_2infunc判断信息输出。task_1每次执行con.notify_all()操作时,awaitcon.wait_for(judge)中的judge函数都会执行一次判断。asyncwithcon:#获取锁awaitcon.wait_for(judge)#先释放锁,等待notify_all()函数触发。触发后立即获取锁,然后执行判断函数。然后释放锁,继续等待notify_all()函数触发wait_for。源码如下:asyncdefwait_for(self,predicate):"""等待谓词变为真。谓词应该是可调用的,结果将被解释为布尔值。最终的谓词值是返回值."""result=predicate()whilenotresult:awaitself.wait()result=predicate()returnresultself.wait()方法总是先释放锁,等待notify_all()触发,然后获取锁,然后执行predicate()函数
