在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关键字来等另外一个协程的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。