首先要明确如下认知:
-
同步语言的异步库与原生标准库不兼容. 以python为例, 原生标准库的
time.sleep(5)将占用 CPU 5秒钟, 在此CPU调度到该程序时, 这5秒钟将被浪费; 而异步库asyncio.sleep(5)将会让出CPU, 在CPU调度到此程序时, 可以执行其他协程中的任务. 同样, 异步库中的文件读写, 网络IO也与原生read, socket及http request行为不同. -
一般不同种类的异步库之间的方法不可混用, 比如gevent是用patch的方法让原生标准库拥有异步能力, 但对于某些较为底层(如psycopg2数据库驱动, C语言编写)不能很好的支持; tornado框架的http与socket使用的是其内置的事件循环, 且没有提供异步文件操作. 本系列文档着重讲解asyncio族的异步操作, 与gevent, tornado会有对比, 但不会详细介绍.
- 协程模型回显服务器
- 使用asyncio编写的简单的echo回显socket服务, 包括服务端与客户端.
- 原生socket, asyncio提供的
sock_accept(),sock_recv()与sock_send()收发函数.
- 简单协程示例
- 使用aiohttp库进行简单的http get请求
- 进阶示例, 多http请求并发调用.
- asyncio中的回调函数(
add_done_callback())与超时时间(asyncio.wait())设置
- 动态添加任务
- 线程+协程, 动态生成异步协程任务放到事件循环
- tornado事件循环初试
- tornado实现的事件循环, 极简示例
- 动态添加任务改进
- 使用asyncio提供的异步队列, 实现生产者消费者模型
- 协程超时-装饰器
- 一时无聊, 将异步请求中的超时设置抽象成了装饰器, 可重复使用.
- 限制协程并发数量-semaphore
- 类似于进程间同步机制的
asyncio.Semaphore(), 限制协程任务的并发数量, 可防止过载.
- 类似于进程间同步机制的
- 协程池-asyncpool
- 还没来得及写, 但觉得很有必要, 协程虽然占用资源少, 但也不能无限创建.
- 协程模型回显服务器(二)
- asyncio的
start_server()与loop的create_server(), 替换原生socket()来启动服务端.
- asyncio的
- python3.7中asyncio协程回显示例
- python3.7中与3.6相比 asyncio的api有些变化, 这里是一个简单示例.
- python3-concurrenct.futures真正的并行计算
concurrenct.futures()多进程模型对CPU密集型任务的作用, 最好先理解concurrenct.futures()本身的作用.
- asyncio的call_XX函数族
- call_XXX函数族, 设置协程任务回调操作
- 异步文件读写及异步数据库操作
- 选用了两个异步库, 进行异步文件读写与异步数据库读写, 兼容于asyncio的事件循环.
- aiohttp.web 简单的异步web服务器
- 其他示例请求的
http://localhost:3000/aio接口, 就是这个服务器提供的.
- 其他示例请求的
上述示例中有多个示例使用到了http://localhost:3000/aio这个接口, 是用示例14提供的. 对于一个/aio请求, 它会随机沉睡1-30秒再返回, 返回的内容是一个json字符串, 结构为{delay: 沉睡的秒数}, 示例中用这个接口来学习协程的使用方法.