异步介绍就不说了.
基础:python协程 python生成器 协程 yield yield from
异步基于事件循环 事件循环基础
在线程中运行与关闭事件循环:动态添加协程 关闭协程
补充材料[ 如不想了解 完全不会影响asyncio的理解和学习, 直接略过即可 ]:
C实现的select模型:I/O复用 select c/s 网络模型
windows下可以使用IOCP , 了解win下编程的可以看看IOCP的实现 : IOCP 完成端口服务器模型
正文
协程只运行在事件循环中,
默认情况下asyncio.get_event_loop() 是一个select模型的事件循环,
默认事件循环 asyncio.get_event_loop() 属于主线程,
一个线程一个事件循环, 为什么要一个线程一个事件循环?
[ 这个东西不去了解完全不会影响asyncio包的学习, 如果不懂的话记住一个线程一个事件循环就得了]
简单来说 :事件循环分2个,一个select 模型, 一个win下可用的完成端口模型,而不论select还是IOCP
一般都是死循环 后面调用select 阻塞函数 , iocp的通知消息也是通过线程池中的死循环调用GetQueuedCompletionStatus来完成;
如果要了解一下select / IOCP模型 上面都贴了链接
如果你要使用多个事件循环 , 创建线程后调用
lp = asyncio.new_event_loop() #创建一个新的事件循环
asyncio.set_event_loop(lp) #设置当前线程的事件循环
核心思想: yield from / await . 就这2个关键字, 运行(驱动)一个协程, 同时交出当前函数的控制权,让事件循环执行下个任务.
yield from的实现原理:yield from实现
要搞懂asyncio协程,还是先把生成器弄懂,如果对生成器很模糊,
比如yield from 生成器对象,这个看不懂的话,建议先看python生成器 yield from
有2个方式让协程运行起来,协程(生成器)本身是不运行的
1. await / yield from 协程
2.asyncio.ensure_future/async(协程)
上面2个方式的区别是 await / yield from 这一组能等待协程完成
注意:
1. 协程就是生成器的增强版