简介
协程:又称为微线程,在一个线程中执行,执行函数时可以随时中断,由程序(用户)自身控制,执行效率极高,与多线程比较,没有切换线程的开销和多线程锁机制。
测试
import aiohttp import asyncio from datetime import datetime async def fetch(client): headers = {'content-type': 'application/json', 'User-Agent': 'Python/3.8 aiohttp/3.8.2'} async with client.get('http://httpbin.org/get',headers=headers) as resp: return await resp.text() async def main(): async with aiohttp.ClientSession() as client: html = await fetch(client) print(html) loop = asyncio.get_event_loop() start = datetime.now() loop.run_until_complete(main()) end = datetime.now() print("aiohttp版爬虫花费时间为:") print(end - start)
2. 报错
2.1 信号灯超时间已到问题
解决
注意当任务量较多时,以上写法会报错,提示信号灯超时时间已到,这是因为我们每个请求都创建了一个session,当请求过多时,就会报错,我们这时候就要使session复用,让每个请求使用同一个session。
3. 多进程结合
既然异步协程和多进程对网络请求都有提升,那么为什么不把二者结合起来呢?在最新的 PyCon 2018 上,来自 Facebook 的 John Reese 介绍了 asyncio 和 multiprocessing 各自的特点,并开发了一个新的库,叫做 aiomultiprocess。
安装
pip install aiomultiprocess