在协程中使用队列
在Python3.5之后,实现协程就变得非常简单,因为提供了字段await和async,再也不需要在使用asyncio里面使用装饰器的方式去写协程,不过,经常我们需要在程序中使用队列,不过好在asyncio给提供好了专门的方法,这样使用起来就非常简单了,使用put和get方式就可以操作队列。我们可以看一个例子:
import asyncio
async def make_tea(num:int,data:asyncio.Queue):
for i in range(num):
print('第{}杯奶茶正在制作!'.format(i + 1))
await data.put(i)
await asyncio.sleep(1)#类似于普通函数下的time.sleep(1)
print('第{}杯奶茶已经卖出去!'.format(i+1))
async def drink_tea(num:int,data:asyncio.Queue):
count=0
while count<num:
content=await data.get()
print('正在喝第{}杯奶茶'.format(content+1))
count+=1
data=asyncio.Queue()#默认是新建一个容量无限的队列
loop=asyncio.get_event_loop()
task1=loop.create_task(make_tea(10,data))#新建任务1
task2=loop.create_task(drink_tea(10,data))#新建任务2
tasks=asyncio.gather(task1,task2)#将任务1和2打包成一个任务
loop.run_until_complete(tasks)
我们可以看一下运行的结果:
第1杯奶茶正在制作!
正在喝第1杯奶茶
第1杯奶茶已经卖出去!
第2杯奶茶正在制作!
正在喝第2杯奶茶
第2杯奶茶已经卖出去!
第3杯奶茶正在制作!
正在喝第3杯奶茶
第3杯奶茶已经卖出去!
第4杯奶茶正在制作!
正在喝第4杯奶茶
第4杯奶茶已经卖出去!
第5杯奶茶正在制作!
正在喝第5杯奶茶
第5杯奶茶已经卖出去!
第6杯奶茶正在制作!
正在喝第6杯奶茶
第6杯奶茶已经卖出去!
第7杯奶茶正在制作!
正在喝第7杯奶茶
第7杯奶茶已经卖出去!
第8杯奶茶正在制作!
正在喝第8杯奶茶
第8杯奶茶已经卖出去!
第9杯奶茶正在制作!
正在喝第9杯奶茶
第9杯奶茶已经卖出去!
第10杯奶茶正在制作!
正在喝第10杯奶茶
第10杯奶茶已经卖出去!
这样我们就可以轻松的使用队列了,不过有需要注意的是,这个队列默认是无限容量的,普通的队列使用需要指定队列大小,在协程里面无法获取队列大小;而且我们也可以仔细发现,await data.put(i)
和await asyncio.sleep(1)
是同时在运行,只是asyncio.sleep(1)
运行的时间更长,所以后运行下一句。
转载自:https://juejin.cn/post/7032584170106781703