Использование очередей в сопрограммах

Python

После Python 3.5 реализация сопрограмм стала очень простой, потому что предусмотрены поля await и async, и нет необходимости использовать декораторы в asyncio для написания сопрограмм, однако нам часто приходится использовать их в программах Queue, но, к счастью, 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)Работает дольше, поэтому запустите следующее предложение после.