aiohttp使用
aiohttp使用
一、快速回顾
1. 多线程
- #_*_coding:utf-8_*_
- import time
- import requests
- from multiprocessing.dummy import Pool
- from multiprocessing.pool import ThreadPool
- pool = Pool(3)
- urls = ["http://www.baidu.com" for i in range(3)]
- print(urls)
- def get_req(url):
- r = requests.head(url)
- print(r)
- return r
- ret_list = pool.map(get_req, urls)
- print(ret_list)
- def analysis_req(data):
- r = "analysis data: {}, {}, {}".format(len(data.headers), data.status_code, data.text)
- return r
- ret_list = pool.map(analysis_req, ret_list)
- 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几个概念
- 协程对象
- 任务对象
- 事件循环
- await
- 协程对象: 可以把协程当做是一个特殊的函数.如果一个函数的定义被async关键字所修饰.该特殊的函数被调用后函数内部的程序语句不会被立即执行,而是会返回一个协程对象.
- 任务对象: 所谓的任务对象就是对协程对象的进一步封装.在任务对象中可以实现显示协程对象的运行状况. 任务对象最终是需要被注册到事件循环对象中.
- 绑定回调:回调函数是绑定给任务对象,只有当任务对象对应的特殊函数被执行完毕后,回调函数才会被执行
- 事件循环对象:无限循环的对象.也可以把其当成是某一种容器.该容器中需要放置多个任务对象(就是一组待执行的代码块).
- 异步的体现: 当事件循环开启后,该对象会安装顺序执行每一个任务对象,
当一个任务对象发生了阻塞事件循环是不会等待,而是直接执行下一个任务对象
- 异步的体现: 当事件循环开启后,该对象会安装顺序执行每一个任务对象,
- await: 挂起的操作.交出cpu的使用权
2-1. 例子: 单个任务
- from time import sleep
- import asyncio
- # 回调函数:
- # 默认参数:任务对象
- def callback(task):
- print('i am callback!!1')
- print(task.result()) # result返回的就是任务对象对应的那个特殊函数的返回值
- async def get_request(url):
- print('正在请求:', url)
- sleep(2)
- print('请求结束:', url)
- return 'hello bobo'
- # 创建一个协程对象
- c = get_request('www.163.com')
- print(c) # <coroutine object get_request at 0x0000023337E1CEB8>
- # 封装一个任务对象
- task = asyncio.ensure_future(c)
- # 给任务对象绑定回调函数
- task.add_done_callback(callback)
- # 创建一个事件循环对象
- loop = asyncio.get_event_loop()
- loop.run_until_complete(task) # 将任务对象注册到事件循环对象中并且开启了事件循环
<coroutine object get_request at 0x7fd3e0228938>
正在请求: www.163.com
请求结束: www.163.com
i am callback!!1
hello bobo