aiohttp使用

aiohttp使用

一、快速回顾

1. 多线程

  1. #_*_coding:utf-8_*_ 
  2.  
  3. import time 
  4. import requests 
  5. from multiprocessing.dummy import Pool 
  6. from multiprocessing.pool import ThreadPool 
  7.  
  8. pool = Pool(3) 
  9.  
  10. urls = ["http://www.baidu.com" for i in range(3)] 
  11. print(urls) 
  12.  
  13. def get_req(url): 
  14. r = requests.head(url) 
  15.  
  16. print(r) 
  17. return r 
  18.  
  19. ret_list = pool.map(get_req, urls) 
  20. print(ret_list) 
  21.  
  22.  
  23. def analysis_req(data): 
  24. r = "analysis data: {}, {}, {}".format(len(data.headers), data.status_code, data.text) 
  25. return r 
  26.  
  27. ret_list = pool.map(analysis_req, ret_list) 
  28. print(ret_list) 

输出
[‘http://www.baidu.com’, ‘http://www.baidu.com’, ‘http://www.baidu.com’]
<Response [200]>
<Response [200]>
<Response [200]>
[<Response [200]>, <Response [200]>, <Response [200]>]
['analysis data: 8, 200, ', 'analysis data: 8, 200, ', 'analysis data: 8, 200, ']

2. asyncio几个概念

  1. 协程对象
  2. 任务对象
  3. 事件循环
  4. await
  • 协程对象: 可以把协程当做是一个特殊的函数.如果一个函数的定义被async关键字所修饰.该特殊的函数被调用后函数内部的程序语句不会被立即执行,而是会返回一个协程对象.
  • 任务对象: 所谓的任务对象就是对协程对象的进一步封装.在任务对象中可以实现显示协程对象的运行状况. 任务对象最终是需要被注册到事件循环对象中.
    • 绑定回调:回调函数是绑定给任务对象,只有当任务对象对应的特殊函数被执行完毕后,回调函数才会被执行
  • 事件循环对象:无限循环的对象.也可以把其当成是某一种容器.该容器中需要放置多个任务对象(就是一组待执行的代码块).
    • 异步的体现: 当事件循环开启后,该对象会安装顺序执行每一个任务对象,
      当一个任务对象发生了阻塞事件循环是不会等待,而是直接执行下一个任务对象
  • await: 挂起的操作.交出cpu的使用权

2-1. 例子: 单个任务

  1. from time import sleep 
  2. import asyncio 
  3.  
  4.  
  5. # 回调函数: 
  6. # 默认参数:任务对象 
  7. def callback(task): 
  8. print('i am callback!!1') 
  9. print(task.result()) # result返回的就是任务对象对应的那个特殊函数的返回值 
  10.  
  11.  
  12. async def get_request(url): 
  13. print('正在请求:', url) 
  14. sleep(2) 
  15. print('请求结束:', url) 
  16. return 'hello bobo' 
  17.  
  18.  
  19. # 创建一个协程对象 
  20. c = get_request('www.163.com') 
  21. print(c) # <coroutine object get_request at 0x0000023337E1CEB8> 
  22. # 封装一个任务对象 
  23. task = asyncio.ensure_future(c) 
  24.  
  25. # 给任务对象绑定回调函数 
  26. task.add_done_callback(callback) 
  27.  
  28. # 创建一个事件循环对象 
  29. loop = asyncio.get_event_loop() 
  30. loop.run_until_complete(task) # 将任务对象注册到事件循环对象中并且开启了事件循环 

<coroutine object get_request at 0x7fd3e0228938>
正在请求: www.163.com
请求结束: www.163.com
i am callback!!1
hello bobo

二、sdfsdfsdf

posted @ 2020-05-28 16:27  众里寻,阑珊处  阅读(591)  评论(0编辑  收藏  举报
返回顶部