python-asyncio
-
python由于GIL(全局锁)的存在,不能发挥多核的优势,在io密集型的网络里,异步处理能大幅提升效率
-
coroutine(协程)
- 协程处理逻辑
- 通常用生产者-消费者设计模式来处理协程
- 创建协程 -> 添加到队列 -> 创建协程 -> 添加到队列 -> 消费者绑定对象 -> 消费者消费队列中的协程
- 协程处理逻辑
-
任务处理的逻辑
- 同步:触发任务1->处理任务1->触发任务2->处理任务2->顺序执行
- 异步:触发任务1->触发任务2->触发任务3(只触发,不处理)
def sync_run():
print('start') # 打印事件,处理
time.sleep(1) # 等待事件,处理
print('end') # 打印事件,处理
import asyncio
async def demo(n: int):
print('start',n)
await asyncio.sleep(n)
print('stop',n)
tasks = []
# 打印2112
tasks.append(demo(2))
tasks.append(demo(1))
# 打印1212
# tasks.append(demo(1))
# tasks.append(demo(2))
loop = asyncio.get_event_loop()
future = asyncio.wait(tasks)
loop.run_until_complete(future) # 消费
- async&asyncio
async def demo():pass
,定义一个方法,这个方法是异步方法,demo()后会创建一个coroutine
协程对象,然后交出执行权,不会像方法一样直接执行,必须加入到event loop后统一执行- await,执行协程过程中遇到了await,则会在异步任务开始之后暂停当前协程的执行,把执行权交给其他任务,等到异步任务执行结束,再执行
- 创建协程对象,执行协程
- 创建event-loop,创建协程对象,执行协程对象,遇到异步任务,交出执行权,执行下一个协程对象,一直循环这个处理逻辑
总结:async描述一个协程对象,await描述一个异步任务,queue存储协程对象,loop处理协程对象和异步任务