单线程不足之处

当对多个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异步爬虫之线程池相关推荐

  1. 《转载》Python并发编程之线程池/进程池--concurrent.futures模块

    本文转载自 Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mul ...

  2. @Async 异步任务自定义线程池的配置方法和 @Scheduled 定时任务自定义线程池的配置方式

    文章目录 一.定时和异步业务场景描述 二.定时调度任务的实现方式 三.定时调度任务的问题描述 四.定时调度多线程解决方案(方案一) 五.异步多线程程序实现方式 六.定时调度多线程解决方案(方案二) 一 ...

  3. python爬取使用线程池出现报错:exception calling callback for #x3c;Future at 0x1e8e963ef70 state=finished raised

    python爬取使用线程池出现报错:exception calling callback for <Future at 0x1e8e963ef70 state=finished raised T ...

  4. Java异步并发和线程池

    Java异步并发和线程池 1.一条简单粗暴的路: a.使用 parallelStream可能存在的bug b. 如何正确使用 parallelStream 2.另一条路 参考1: https://we ...

  5. 最新实用Python异步爬虫代理池(开源)

    --  Illustrations by Tom Haugomat -- 陈键冬 Python中文社区专栏作者,pyecharts开源项目核心开发者. GitHub:chenjiandongx 项目地 ...

  6. Python爬虫——使用线程池爬取同程旅行景点数据并做数据可视化

    大家好!我是霖hero 正所谓:有朋自远方来,不亦乐乎?有朋友来找我们玩,是一件很快乐的事情,那么我们要尽地主之谊,好好带朋友去玩耍!那么问题来了,什么时候去哪里玩最好呢,哪里玩的地方最多呢? 今天将 ...

  7. python爬虫利用线程池下载视频

    由于requests模块中,requests.get()是线程阻塞的,所有当有多个爬虫进行爬取时,那么单线程式爬虫是耗时比较长的,所以我们需要使用线程池,利用线程池来爬取耗时比较长的资源,这里我们使用 ...

  8. Python爬虫_线程池实例——北京新发地菜价

    import requests import json import jsonpath from concurrent.futures import ThreadPoolExecutor print( ...

  9. 10-异步爬虫(线程池/asyncio协程)实战案例

    异步爬虫: 基于线程池 基于单线程+多任务的异步爬虫 线程池 from multiprocessing.dummy import Pool map(callback,alist) 可以使用callba ...

最新文章

  1. hdu3342 拓扑序
  2. Spring Boot实践教程(二):SpringApplication分析
  3. mysql: order by, group by ,having, select, where 执行 顺序
  4. mysql中gbk编码汉字和英文_MySQL字符集 GBK、GB2312、UTF8区别 解决 MYSQL中文乱码问题...
  5. HDU2188 选拔志愿者【巴什博弈】
  6. android 通知栏进度_Android改造下载图片进度通知
  7. android自定义view案例,Android自定义View,你摸的透透的了?
  8. Github中的缩写(PR, WIP, PTAL, TBR, TL, LGTM, SGTM, AFAIK, CC)含义
  9. Matlab中单元数组和结构数组
  10. LittleVGL入门
  11. 终于知道超级服务器和高质量服务器的区别了
  12. 穷与焦虑。文/江湖一剑客
  13. 微信小程序云函数处理客服消息
  14. AutoCAD2012安装失败解决办法,Failed Installation aborted, Res
  15. 手机+固定电话+传真的正则
  16. 让IIS支持PHP (转载)
  17. ·穷途末路之举·解决VirtualBox启动问题-Error relaunching VirtualBox VM process 5/terminated with exit code1(0x1)
  18. 计算机专业英语第五版unit2翻译,计算机专业英语教程第5版翻译
  19. 从零开始之驱动发开、linux驱动(二十七、修改三星平台framebuffer参数支持我们的LCD)
  20. hust数控系统_HUST CNC H4-2 SYSTEM CNC数控系统

热门文章

  1. 实录:余凯、颜水成、梅涛、张兆翔、山世光同台讨论 “深度学习的能与不能”
  2. python 移动一个文件或目录
  3. 【同步DC-DC降压控制器】5.5V-65V宽输入电压范围 SCT82630
  4. web前端面试-10大经典题(HTML基础)
  5. 华为大数据平台凭什么成为行业领跑者?
  6. UPC1430 Color a Tree(贪心)
  7. [TCP/IP] Linux 搭建服务器局域网
  8. 【ESP32】15.OLED显示实验(SPI / 字模提取)
  9. java字符串中Emoji表情处理
  10. Python基础——科赫雪花绘制