在协程中使用队列

在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)运行的时间更长,所以后运行下一句。

Guess you like

Origin juejin.im/post/7032584170106781703