asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持。
asnycio是用来编写并发代码的库,python3.5以后使用async/await语法。
asyncio 被用作多个提供高性能 Python 异步框架的基础,包括网络和网站服务,数据库连接库,分布式任务队列等等。
asyncio 往往是构建 IO 密集型和高层级 结构化 网络代码的最佳选择。
asyncio 提供一组 高层级 API 用于:
并发地 运行 Python 协程 并对其执行过程实现完全控制;
执行 网络 IO 和 IPC;
控制 子进程;
通过 队列 实现分布式任务;
同步 并发代码;
此外,还有一些 低层级 API 以支持 库和框架的开发者 实现:
创建和管理 事件循环,以提供异步 API 用于 网络化, 运行 子进程,处理 OS 信号 等等;
使用 transports 实现高效率协议;
通过 async/await 语法 桥接 基于回调的库和代码。
利用asyncio实现hello world协程
python3.4
importasyncio
@asyncio.coroutinedefhello():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。
那么上述代码可以简化为:
importasyncio
asyncdefhello():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来执行异步函数
上述代码可以改为:
importasyncio
asyncdefhello():print("Hello!---")#异步调用asyncio.sleep(1):
await asyncio.sleep(1)print("---World!")
asyncio.run(hello())