likes
comments
collection
share

在协程中使用队列

作者站长头像
站长
· 阅读数 4

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