多任务异步协程

多任务异步协程基础

  • 编码流程

    • 定义特殊函数

    • 创建协程对象

    • 创建任务对象

    • 创建事件循环对象

    • 将任务注册到事件循环对象中

  • 特殊的函数:使用async修饰函数,则该函数就是一个特殊的函数,

    •  async def get_request(url):
          print('正在请求:',url)
          sleep(1)
          print('请求结束:',url)
  • 协程对象:特殊函数被调用后函数内部的实现语句不会被立即执行,该函数调用后会返回一个协程对象

    •  c = get_request('www.1.com')
  • 任务对象:任务对象就是对协程对象的进一步的封装

    • 任务对象 == 高级的协程对象 == 特殊的函数调用

    • 创建任务对象

      扫描二维码关注公众号,回复: 10077542 查看本文章
      •  task = asyncio.ensure_future('协程对象')
    • 绑定回调

      • 任务对象结束之后执行回调函数

      •  #绑定回调
         task.add_done_callback(parse)
         def parse(task): # tesk参数能获取特殊函数的返回值
            print('i am task callback()!!!=----',task.result()) # task。result()就是特殊函数的返回值
  • 事件循环对象

    •  #创建一个事件循环对象
       loop = asyncio.get_event_loop()
    • 作用:将注册在事件循环对象的任务对象进行异步执行

    •  #将任务对象注册到事件循环对象中并且开启事件循环
       loop.run_until_complete(task),# 不修饰task会报错
       loop.run_until_complete(asyncio.wait(tasks))
  • 注意事项:在特殊函数内部的实现语句中不可以出现不支持异步的模块对应的代码,否则就是终止多任务异步协程的异步效果,例如time模块,requests模块

    •  # 替代time模块
       await asyncio.sleep(3) # 必须加await让程序等待阻塞完成
    • aihttp模块

      • 编码流程

        • 基本架构

          •  with aiohttp.ClientSession() as s:
              with await s.get(url) as response:
                    page_text = response.text()
                    return page_text
        • 补充细节

          • 添加async关键字

            • 每一个with前加async

          • 添加await关键字

            • 加在每一步的阻塞操作前加await

              • 请求

              • 获取响应数据(规定)

          •  async with aiohttp.ClientSession() as s:
                #get/post:proxy = 'http://ip:port' 不一样,不是字典了
                #url,headers,data/prames跟requests一样
                async with await s.get(url) as response:
                    page_text = await response.text()#text()字符串形式的响应数据。read()二进制的响应数据
                    return page_text
      • 支持异步的网络请求模块替代requests模块发起网络请求,请求完毕要close,使用with自动化关闭

      •  async def get_request(url):
            async with aiohttp.ClientSession() as s:
                #get/post:proxy = 'http://ip:port' 不一样,不是字典了
                #url,headers,data/prames跟requests一样
                async with await s.get(url) as response:
                    page_text = await response.text()#text()字符串形式的响应数据。read()二进制的响应数据
                    return page_text

猜你喜欢

转载自www.cnblogs.com/W-Y-C/p/12550245.html