在python里使用await关键字来等另外一个协程的实例
一个协程里可以启动另外一个协程,并等待它完成返回结果,采用await关键字,
例子如下:
importasyncio asyncdefouter(): print('inouter') print('waitingforresult1') result1=awaitphase1() print('waitingforresult2') result2=awaitphase2(result1) return(result1,result2) asyncdefphase1(): print('inphase1') return'result1' asyncdefphase2(arg): print('inphase2') return'result2derivedfrom{}'.format(arg) event_loop=asyncio.get_event_loop() try: return_value=event_loop.run_until_complete(outer()) print('returnvalue:{!r}'.format(return_value)) finally: event_loop.close() 输出结果如下: inouter waitingforresult1 inphase1 waitingforresult2 inphase2 returnvalue:('result1','result2derivedfromresult1')
await关键字添加了一个新的协程到循环里,而不需要明确地添加协程到这个事件循环里。
补充知识:python里使用Condition对象来唤醒指定数量的协程
在asyncio库里,定义Condition对象,它的行为与事件Event有点像,区别是事件是通知所有对象,Condition对象可以指定一定数量的协程被通知,它是通过函数notify()来实现的,如果参数里放2,就是通知两个协程,例子如下:
importasyncio asyncdefconsumer(condition,n): withawaitcondition: print('consumer{}iswaiting'.format(n)) awaitcondition.wait() print('consumer{}triggered'.format(n)) print('endingconsumer{}'.format(n)) asyncdefmanipulate_condition(condition): print('startingmanipulate_condition') #pausetoletconsumersstart awaitasyncio.sleep(0.1) foriinrange(1,3): withawaitcondition: print('notifying{}consumers'.format(i)) condition.notify(n=i) awaitasyncio.sleep(0.1) withawaitcondition: print('notifyingremainingconsumers') condition.notify_all() print('endingmanipulate_condition') asyncdefmain(loop): #Createacondition condition=asyncio.Condition() #Setuptaskswatchingthecondition consumers=[ consumer(condition,i) foriinrange(5) ] #Scheduleatasktomanipulatetheconditionvariable loop.create_task(manipulate_condition(condition)) #Waitfortheconsumerstobedone awaitasyncio.wait(consumers) event_loop=asyncio.get_event_loop() try: result=event_loop.run_until_complete(main(event_loop)) finally: event_loop.close()
结果输出如下:
startingmanipulate_condition consumer2iswaiting consumer3iswaiting consumer4iswaiting consumer1iswaiting consumer0iswaiting notifying1consumers consumer2triggered endingconsumer2 notifying2consumers consumer3triggered endingconsumer3 consumer4triggered endingconsumer4 notifyingremainingconsumers endingmanipulate_condition consumer1triggered endingconsumer1 consumer0triggered endingconsumer0
以上这篇在python里使用await关键字来等另外一个协程的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。