协程
- 协程是单线程,由用户决定何时切换
- 必须头脑清晰地决策切换时机
协程库
- async def 定义协程函数
- await 从当前任务切出
- asyncio.create_task 创建任务
- asyncio.gather 收集结果,等待并按给定的顺序返回其结果
- asyncio.run 事件循环开启
生产者、消费者
import asyncio
import time
async def consumer(queue, id):
while True:
val = await queue.get()
print("{} get: {}".format(id, val))
await asyncio.sleep(1)
async def producer(queue, id):
for i in range(3):
await queue.put(i)
print("{} put: {}".format(id, i))
await asyncio.sleep(1)
async def main():
queue = asyncio.Queue()
consumer_1 = asyncio.create_task(consumer(queue, 'consumer_1'))
consumer_2 = asyncio.create_task(consumer(queue, 'consumer_2'))
producer_1 = asyncio.create_task(producer(queue, 'producer_1'))
producer_2 = asyncio.create_task(producer(queue, 'producer_2'))
await asyncio.gather(consumer_1, consumer_2, producer_1, producer_2)
asyncio.run(main())
运行结果:
producer_1 put: 0
producer_2 put: 0
consumer_1 get: 0
consumer_2 get: 0
producer_1 put: 1
producer_2 put: 1
consumer_1 get: 1
consumer_2 get: 1
producer_1 put: 2
producer_2 put: 2
consumer_1 get: 2
consumer_2 get: 2
参考
景霄. 揭秘 python 协程. https://time.geekbang.org/column/article/101855