python之asyncio

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开始引入了新的语法asyncawait,可让coroutine的代码更简洁易读。

请注意,asyncawait是针对coroutine的新语法,要使用新的语法,只须要作两步简单的替换:

  1. @asyncio.coroutine替换为async
  2. 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())
相关文章
相关标签/搜索