多线程概述

多线程使得程序内部可以分出多个线程来做多件事情,充分利用CPU空闲时间,提升处理效率。python提供了两个模块来实现多线程thread 和threading ,thread 有一些缺点,在threading 得到了弥补。并且在Python3中废弃了thread模块,保留了更强大的threading模块。

使用场景

在python的原始解释器CPython中存在着GIL(Global Interpreter Lock,全局解释器锁),因此在解释执行python代码时,会产生互斥锁来限制线程对共享资源的访问,直到解释器遇到I/O操作或者操作次数达到一定数目时才会释放GIL。所以,虽然CPython的线程库直接封装了系统的原生线程,但CPython整体作为一个进程,同一时间只会有一个获得GIL的线程在跑,其他线程则处于等待状态。这就造成了即使在多核CPU中,多线程也只是做着分时切换而已。

如果你的程序是CPU密集型,多个线程的代码很有可能是线性执行的。所以这种情况下多线程是鸡肋,效率可能还不如单线程因为有上下文切换开销。但是如果你的代码是IO密集型,涉及到网络、磁盘IO的任务都是IO密集型任务,多线程可以明显提高效率,例如多线程爬虫,多线程文件处理等等

多线程爬虫

多线程爬虫的代码实例

注: 以下代码在python3下运行通过, python2版本差异较大,不能运行成功,如需帮助请下方留意。

# coding=utf-8

import threading, queue, time, urllib

from urllib import request

baseUrl = 'http://www.pythontab.com/html/pythonjichu/'

urlQueue = queue.Queue()

for i in range(2, 10):

url = baseUrl + str(i) + '.html'

urlQueue.put(url)

#print(url)

def fetchUrl(urlQueue):

while True:

try:

#不阻塞的读取队列数据

url = urlQueue.get_nowait()

i = urlQueue.qsize()

except Exception as e:

break

print ('Current Thread Name %s, Url: %s ' % (threading.currentThread().name, url))

try:

response = urllib.request.urlopen(url)

responseCode = response.getcode()

except Exception as e:

continue

if responseCode == 200:

#抓取内容的数据处理可以放到这里

#为了突出效果, 设置延时

time.sleep(1)

if __name__ == '__main__':

startTime = time.time()

threads = []

# 可以调节线程数, 进而控制抓取速度

threadNum = 4

for i in range(0, threadNum):

t = threading.Thread(target=fetchUrl, args=(urlQueue,))

threads.append(t)

for t in threads:

t.start()

for t in threads:

#多线程多join的情况下,依次执行各线程的join方法, 这样可以确保主线程最后退出, 且各个线程间没有阻塞

t.join()

endTime = time.time()

print ('Done, Time cost: %s ' % (endTime - startTime))

运行结果:

1个线程时:

Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/2.html

Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/3.html

Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/4.html

Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/5.html

Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/6.html

Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/7.html

Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/8.html

Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/9.html

Done, Time cost: 8.182249069213867

2个线程时:

Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/2.html

Current Thread Name Thread-2, Url: http://www.pythontab.com/html/pythonjichu/3.html

Current Thread Name Thread-2, Url: http://www.pythontab.com/html/pythonjichu/4.html

Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/5.html

Current Thread Name Thread-2, Url: http://www.pythontab.com/html/pythonjichu/6.html

Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/7.html

Current Thread Name Thread-2, Url: http://www.pythontab.com/html/pythonjichu/8.html

Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/9.html

Done, Time cost: 4.0987958908081055

3个线程时:

Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/2.html

Current Thread Name Thread-2, Url: http://www.pythontab.com/html/pythonjichu/3.html

Current Thread Name Thread-3, Url: http://www.pythontab.com/html/pythonjichu/4.html

Current Thread Name Thread-4, Url: http://www.pythontab.com/html/pythonjichu/5.html

Current Thread Name Thread-2, Url: http://www.pythontab.com/html/pythonjichu/6.html

Current Thread Name Thread-4, Url: http://www.pythontab.com/html/pythonjichu/7.html

Current Thread Name Thread-1, Url: http://www.pythontab.com/html/pythonjichu/9.html

Current Thread Name Thread-3, Url: http://www.pythontab.com/html/pythonjichu/8.html

Done, Time cost: 2.287320137023926

通过调节线程数可以看到,执行时间会随着线程数的增加而缩短,抓取效率成正比增加。

总结:

Python多线程在IO密集型任务,多线程可以明显提高效率,CPU密集型任务不适合使用多线程处理。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

本文标题: Python3多线程爬虫实例讲解代码

本文地址: http://www.cppcns.com/jiaoben/python/216839.html

python多线程爬虫实例-Python3多线程爬虫实例讲解代码相关推荐

  1. python3爬虫实例-python3 网络爬虫 实例1

    scrapy pip install scrapy pip install pyOpenSSL pip install cryptography pip install CFFI pip instal ...

  2. python爬虫ip代理池_爬虫教程-Python3网络爬虫开发——IP代理池的维护

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 准备工作 要实现IP代理池我们首先需要成功安装好了 Redis 数据库并启动服务,另外还需要安装 Aiohttp.Requests.RedisPy.PyQ ...

  3. python爬虫执行js代码_爬虫之python3用execjs执行JS代码

    JS运行环境 Node.js 是Javascript语言服务器端运行环境 测试运行 测试运行JavaScript程序 微软windows操作系统:附件-命令提示符 需进入到js程序的目录下,node命 ...

  4. 【Python实战案例】Python3网络爬虫:“可惜你不看火影,也不明白这个视频的分量......”m3u8视频下载,那些事儿~

    前言 哈喽!上午好嘞,各位小可爱们!有没有等着急了呀~ 由于最近一直在学习新的内容,所以耽搁了一下下,抱歉.jpg 双手合十. 所有文章完整的素材+源码都在

  5. python获取摄像头型号,python3.6 opencv获取摄像头代码

    注意:运行代码的时候要注意清除缓存 import numpy as np import cv2 cap = cv2.VideoCapture(0) # 从摄像头中取得视频 # 获取视频播放界面长宽 w ...

  6. python3 多线程_Python3多线程爬虫实例讲解

    多线程概述 多线程使得程序内部可以分出多个线程来做多件事情,充分利用CPU空闲时间,提升处理效率.python提供了两个模块来实现多线程thread 和threading ,thread 有一些缺点, ...

  7. python3线程gil_python3爬虫GIL修改多线程实例讲解

    我们打开程序后,会发现电脑的内存和cpu发生了变化.在对于前者上面,自然是希望内容占用小,cpu的利用越高越好.那有没有什么方法可以让我们的cpu达到满状态的运行效果呢?这就得用到我们所学的多线程中的 ...

  8. python回测工具_Python爬虫回测股票的实例讲解

    股票和基金一直是热门的话题,很多周围的人都选择不同种类的理财方式.就股票而言,肯定是短时间内收益最大化,这里我们需要用python爬虫的方法,来帮助我们获取一些股票的数据,这样才能更好的买到相应的股票 ...

  9. UN Comtrade python爬虫实现,多线程动态ip

    原帖见[爬虫]Python使用动态IP,多线程,爬取uncomtrade的数据_学金融的程序员懒羊羊的博客-CSDN博客_爬虫动态ip 修改了url代码,自定义函数的递归问题,跑通代码. 需要自己去i ...

最新文章

  1. CSS选取第n个元素 :nth-child()
  2. SenchaTouch2.3.1 中使用listpaging以及pullrefresh插件 做的分页示例
  3. 详解 | 求你别用效率低下的I/O了,要不试试这种I/O
  4. python中使用%与.format格式化文本
  5. 解决电脑启动报:Reboot and select proper boot device
  6. selenium自动化测试配置工具整理
  7. php连接mysql的字符集问题_关于php7 设计链接mysqlutf8mb4字符集的问题
  8. pandas统计样本分位数
  9. 计算机中常用单位是什么意思,常用单位的换算(含温度、长度、计算机单位、面积以及数量级含义).doc...
  10. RuoYi-Vue 若依 新增子module模块,子模块的接口报404,以及自定义包名后如何确保正确扫描?
  11. 域名申请:一定要进行实名认证吗?
  12. Java实现 | 基于朴素贝叶斯的情感词分析
  13. 我为什么不愿意买衣服
  14. windows10许可证即将过期怎么办_Windows 7 时代即将终结!
  15. oppo手机怎么关闭Android,OPPO手机必须关闭的3个设置,让你的手机永不卡顿,再用3年...
  16. 用html将竖的图片打横,【收藏】让竖版图片变横版不变形的两种方法
  17. 手机防盗版本修改步骤
  18. 虚拟机安装与配置<3>---VMware 16.0上调整虚拟电脑的配置
  19. HTML 框架 noresize=noresize 作用
  20. php常用的数组相关的函数及面向对象

热门文章

  1. 封装、继承和构造函数
  2. 使用Kotlin对ViewGroup的视图进行函数使操作
  3. 一个包从服务器到达客户端
  4. Java将一段逗号分割的字符串转换成一个数组
  5. 微软图表控件MsChart使用说明[转]
  6. python画图代码星星-Python利用for循环打印星号三角形的案例
  7. python手机软件-Python爬虫:抓取手机APP的数据
  8. 不懂编程可以自学python吗-我不会编程,也可能学会Python吗?
  9. python 装饰器 参数-[Python]写个带参数的装饰器
  10. python程序从哪里开始执行-python如何启动