python异步爬虫之线程池
单线程不足之处
当对多个url发送请求时,只有请求完第一个url才会接着请求第二个url(requests是一个阻塞的操作),比如下载图片,这种一个个执行的方式称为单线程。其存在等待的时间,这样效率是很低的。那我们能不能在发送请求等待的时候,为其单独开启进程或者线程以异步的方式进行,继续请求下一个url,执行并行请求呢?这样看起来相当于同时下载很多张图片一样,速度明显提升。
异步爬虫
有如下基于异步爬虫的方案
- 多线程或多进程(不建议)
好处:可以为相关阻塞的操作单独开启线程或者进程,阻塞操作就可以异步会执行
弊端:不能无限制开启多线程或者多进程(需要频繁的创建或者销毁进程,线程)
- 线程池或进程池(适当使用)
好处:可以降低系统对进程或线程创建和销毁的频率,从而很好的而降低系统的开销
弊端:线程或进程池中的数量是有上限的
- 单线程+异步协程(推荐)
线程池
我们先来看看,使用常规的单线程方式下载东西
import time
def get_page(str):print("开始下载:",str)time.sleep(2) #代表下载耗时两秒print("下载成功:",str)print('-------------------')name_list = ['aa','bb','cc','dd']
for i in range(len(name_list)):get_page(name_list[i])
如下,全部下载完四个东西需要8.2秒。因为想下载下一个得等前一个下载完才行
使用线程池如下
# 1.倒入线程池模块对应的类
from multiprocessing.dummy import Pool
import time
def get_page(str):print("开始下载:",str)time.sleep(2)print("下载成功:",str)print('-------------------')name_list = ['aa','bb','cc','dd']# 2.实例化一个线程池对象,线程池中开辟四个线程对象,并行4个线程处理四个阻塞操作
pool = Pool(4)
# 3.将列表中的每一个列表元素(可迭代对象)传递给get_page函数(发生阻塞的操作)进行处理
#map方法会有一个返回值为函数的返回值(一个列表),但是这里没有返回值所以不考虑
#调用map方法
pool.map(get_page,name_list) #第一个参数为会发生阻塞的函数,第二个参数相当于形参
#map方法结束后关闭池子
pool.close()
#主线程等待子线程结束后再结束
pool.join()
此时耗时2.2秒
python异步爬虫之线程池相关推荐
- 《转载》Python并发编程之线程池/进程池--concurrent.futures模块
本文转载自 Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mul ...
- @Async 异步任务自定义线程池的配置方法和 @Scheduled 定时任务自定义线程池的配置方式
文章目录 一.定时和异步业务场景描述 二.定时调度任务的实现方式 三.定时调度任务的问题描述 四.定时调度多线程解决方案(方案一) 五.异步多线程程序实现方式 六.定时调度多线程解决方案(方案二) 一 ...
- python爬取使用线程池出现报错:exception calling callback for #x3c;Future at 0x1e8e963ef70 state=finished raised
python爬取使用线程池出现报错:exception calling callback for <Future at 0x1e8e963ef70 state=finished raised T ...
- Java异步并发和线程池
Java异步并发和线程池 1.一条简单粗暴的路: a.使用 parallelStream可能存在的bug b. 如何正确使用 parallelStream 2.另一条路 参考1: https://we ...
- 最新实用Python异步爬虫代理池(开源)
-- Illustrations by Tom Haugomat -- 陈键冬 Python中文社区专栏作者,pyecharts开源项目核心开发者. GitHub:chenjiandongx 项目地 ...
- Python爬虫——使用线程池爬取同程旅行景点数据并做数据可视化
大家好!我是霖hero 正所谓:有朋自远方来,不亦乐乎?有朋友来找我们玩,是一件很快乐的事情,那么我们要尽地主之谊,好好带朋友去玩耍!那么问题来了,什么时候去哪里玩最好呢,哪里玩的地方最多呢? 今天将 ...
- python爬虫利用线程池下载视频
由于requests模块中,requests.get()是线程阻塞的,所有当有多个爬虫进行爬取时,那么单线程式爬虫是耗时比较长的,所以我们需要使用线程池,利用线程池来爬取耗时比较长的资源,这里我们使用 ...
- Python爬虫_线程池实例——北京新发地菜价
import requests import json import jsonpath from concurrent.futures import ThreadPoolExecutor print( ...
- 10-异步爬虫(线程池/asyncio协程)实战案例
异步爬虫: 基于线程池 基于单线程+多任务的异步爬虫 线程池 from multiprocessing.dummy import Pool map(callback,alist) 可以使用callba ...
最新文章
- hdu3342 拓扑序
- Spring Boot实践教程(二):SpringApplication分析
- mysql: order by, group by ,having, select, where 执行 顺序
- mysql中gbk编码汉字和英文_MySQL字符集 GBK、GB2312、UTF8区别 解决 MYSQL中文乱码问题...
- HDU2188 选拔志愿者【巴什博弈】
- android 通知栏进度_Android改造下载图片进度通知
- android自定义view案例,Android自定义View,你摸的透透的了?
- Github中的缩写(PR, WIP, PTAL, TBR, TL, LGTM, SGTM, AFAIK, CC)含义
- Matlab中单元数组和结构数组
- LittleVGL入门
- 终于知道超级服务器和高质量服务器的区别了
- 穷与焦虑。文/江湖一剑客
- 微信小程序云函数处理客服消息
- AutoCAD2012安装失败解决办法,Failed Installation aborted, Res
- 手机+固定电话+传真的正则
- 让IIS支持PHP (转载)
- ·穷途末路之举·解决VirtualBox启动问题-Error relaunching VirtualBox VM process 5/terminated with exit code1(0x1)
- 计算机专业英语第五版unit2翻译,计算机专业英语教程第5版翻译
- 从零开始之驱动发开、linux驱动(二十七、修改三星平台framebuffer参数支持我们的LCD)
- hust数控系统_HUST CNC H4-2 SYSTEM CNC数控系统
热门文章
- 实录:余凯、颜水成、梅涛、张兆翔、山世光同台讨论 “深度学习的能与不能”
- python 移动一个文件或目录
- 【同步DC-DC降压控制器】5.5V-65V宽输入电压范围 SCT82630
- web前端面试-10大经典题(HTML基础)
- 华为大数据平台凭什么成为行业领跑者?
- UPC1430 Color a Tree(贪心)
- [TCP/IP] Linux 搭建服务器局域网
- 【ESP32】15.OLED显示实验(SPI / 字模提取)
- java字符串中Emoji表情处理
- Python基础——科赫雪花绘制