案例地址

  • 协程

asyncio

  • python3.4开始引入的标准库,内置了对移步io的支持
  • asyncio本身是一个消息循环
  • 步骤
    • 创建消息循环
    • 把协程导入
    • 关闭
  • 案例08
  • 案例09-两个tasks
  • 案例v10-得到多个网站

async and await

  • 为了更好的表示异步io
  • python3.5 开始引入
  • 让coroutine代码更简洁
  • 使用上,可以进行替换
    • 可以把 @asyncio.coroutine 替换成async
    • yield from 替换成await
  • 案例v11, 把案例09直接替换

aiohttp

  • 介绍
    • asyncio实现单线程并发IO,在客户端用处不大
    • 在服务器端可以asyncio+coroutine配合,因为http是io操作
    • asyncio实现了TCP,UIDP,SSL等协议
    • aiohttp是给予asyncio实现的HTTP框架
    • pip install aiohttp
    • 案例07

concurrent.futures

  • python3新增的库
  • 类似其他语言的线程池的概念
  • 此模块利用multiprocessiong实现真正的并行计算
  • 核心原理是:concurrent.futures会以子进程的形式,平行的运行多个python解释器,从而令python程序可以利用多核CPU来提升执行速度。
    由于子进程与主解释器相分离,所以他们的全局解释器锁也是相互独立的。每个子进程都能够完整的使用一个CPU内核。
  • concurrent.futures.Executor
    • ThreadPoolExecutor(线程池)
    • ProcessPoolExecutor(进程池)
  • submit(fn, args, kwargs)

    • fn:异步执行的函数
    • args,kwargs:参数

      官方死锁案例

      import time
      def wait_on_b():
          time.sleep(5)
          print(b.result())  #b不会完成,他一直在等待a的return结果
          return 5
      
      def wait_on_a():
          time.sleep(5)
          print(a.result())  #同理a也不会完成,他也是在等待b的结果
          return 6
      executor = ThreadPoolExecutor(max_workers=2)
      a = executor.submit(wait_on_b)
      b = executor.submit(wait_on_a)
    • 案例v14
  • map(fn, *iterables, timeout=None)

    • 跟map函数类似
    • 函数需要异步执行
    • timeout: 超时时间
    • 案例 v12
    • 案例v15
    • 起执行结果是list,数据需要从list中取出来

      with concurrent.futures.ThreadPoolExecutor(max_workers=3) as executor:
              print(list(executor.map(sleeper, x)))
  • submit和map根据需要选一个即可
  • 案例v13

  • Future
    • 未来需要完成的任务
    • future 实例由Excutor.submit创建
    • 案例v17