asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持。python
asnycio是用来编写并发代码的库,python3.5之后使用async/await语法。数据库
asyncio 被用做多个提供高性能 Python 异步框架的基础,包括网络和网站服务,数据库链接库,分布式任务队列等等。api
asyncio 每每是构建 IO 密集型和高层级 结构化 网络代码的最佳选择。网络
asyncio 提供一组 高层级 API 用于:并发
- 并发地 运行 Python 协程 并对其执行过程实现彻底控制;
- 执行 网络 IO 和 IPC;
- 控制 子进程;
- 经过 队列 实现分布式任务;
- 同步 并发代码;
此外,还有一些 低层级 API 以支持 库和框架的开发者 实现:框架
- 建立和管理 事件循环,以提供异步 API 用于
网络化
, 运行子进程
,处理OS 信号
等等; - 使用 transports 实现高效率协议;
- 经过 async/await 语法 桥接 基于回调的库和代码。
利用asyncio实现hello world协程 异步
python3.4async
import asyncio @asyncio.coroutine def hello(): print("Hello!---") # 异步调用asyncio.sleep(1): r = yield from asyncio.sleep(1) print("---World!") # 获取EventLoop: loop = asyncio.get_event_loop() # 执行coroutine loop.run_until_complete(hello()) loop.close()
@asyncio.coroutine会把一个generator(生成器)标记为coroutine(协程)类型,而后咱们就把这个coroutine扔到eventloop(事件循环)中去。分布式
hello()首先会打印出'Hello!----',而后yeild from语法可让咱们更方便的调用另外一个generator。因为asyncio.sleep(1)也是一个coroutine,全部线程不会等待asyncio,.sleep(1),而是直接中断并执行下一个消息循环了。当asyncio返回时,线程就能够从yield from拿到返回值(此处是None)并执行下一句语句。函数
把asyncio看做是一个耗时1s的I/O操做,在此期间主线程并未等待,而是去执行event_loop中其余能够执行的coroutine了,所以能够实现并发执行。
python 3.5
用asyncio
提供的@asyncio.coroutine
能够把一个generator标记为coroutine类型,而后在coroutine内部用yield from
调用另外一个coroutine实现异步操做。
为了简化并更好地标识异步IO,从Python 3.5开始引入了新的语法async
和await
,可让coroutine的代码更简洁易读。
请注意,async
和await
是针对coroutine的新语法,要使用新的语法,只须要作两步简单的替换:
- 把
@asyncio.coroutine
替换为async
; - 把
yield from
替换为await
。
那么上述代码能够简化为:
import asyncio async def hello(): print("Hello!---") # 异步调用asyncio.sleep(1): await asyncio.sleep(1) print("---World!") # 获取EventLoop: loop = asyncio.get_event_loop() # 执行coroutine loop.run_until_complete(hello()) loop.close()
python 3.7
新增了asyncio.run() api来执行异步函数
上述代码能够改成:
import asyncio async def hello(): print("Hello!---") # 异步调用asyncio.sleep(1): await asyncio.sleep(1) print("---World!") asyncio.run(hello())