Python 爬虫多线程详解及实例代码


Posted in Python onOctober 08, 2016

python是支持多线程的,主要是通过thread和threading这两个模块来实现的。thread模块是比较底层的模块,threading模块是对thread做了一些包装的,可以更加方便的使用。

虽然python的多线程受GIL限制,并不是真正的多线程,但是对于I/O密集型计算还是能明显提高效率,比如说爬虫。
下面用一个实例来验证多线程的效率。代码只涉及页面获取,并没有解析出来。

# -*-coding:utf-8 -*-
import urllib2, time
import threading

class MyThread(threading.Thread):
 def __init__(self, func, args):
  threading.Thread.__init__(self)
  self.args = args
  self.func = func

 def run(self):
  apply(self.func, self.args)

def open_url(url):
 request = urllib2.Request(url)
 html = urllib2.urlopen(request).read()
 print len(html)
 return html
if __name__ == '__main__':
 # 构造url列表
 urlList = []
 for p in range(1, 10):
  urlList.append('http://s.wanfangdata.com.cn/Paper.aspx?q=%E5%8C%BB%E5%AD%A6&p=' + str(p))
# 一般方式
 n_start = time.time()
 for each in urlList:
  open_url(each)
 n_end = time.time()
 print 'the normal way take %s s' % (n_end-n_start)
# 多线程
 t_start = time.time()
 threadList = [MyThread(open_url, (url,)) for url in urlList]
 for t in threadList:
  t.setDaemon(True)
  t.start()
 for i in threadList:
  i.join()
 t_end = time.time()
 print 'the thread way take %s s' % (t_end-t_start)

分别用两种方式获取10个访问速度比较慢的网页,一般方式耗时50s,多线程耗时10s。
多线程代码解读:

# 创建线程类,继承Thread类
class MyThread(threading.Thread):
 def __init__(self, func, args):
  threading.Thread.__init__(self) # 调用父类的构造函数
  self.args = args
  self.func = func

 def run(self): # 线程活动方法
  apply(self.func, self.args)
threadList = [MyThread(open_url, (url,)) for url in urlList] # 调用线程类创建新线程,返回线程列表
 for t in threadList:
  t.setDaemon(True) # 设置守护线程,父线程会等待子线程执行完后再退出
  t.start() # 线程开启
 for i in threadList:
  i.join() # 等待线程终止,等子线程执行完后再执行父线程

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

Python 相关文章推荐
python里将list中元素依次向前移动一位
Sep 12 Python
Python随机生成数模块random使用实例
Apr 13 Python
在主机商的共享服务器上部署Django站点的方法
Jul 22 Python
在MAC上搭建python数据分析开发环境
Jan 26 Python
实例解析Python的Twisted框架中Deferred对象的用法
May 25 Python
浅析Python中else语句块的使用技巧
Jun 16 Python
django数据库migrate失败的解决方法解析
Feb 08 Python
python实现爬取百度图片的方法示例
Jul 06 Python
python自动结束mysql慢查询会话的实例代码
Oct 27 Python
在Matplotlib图中插入LaTex公式实例
Apr 17 Python
python实现密码验证合格程序的思路详解
Jun 01 Python
Python+Xlwings 删除Excel的行和列
Dec 19 Python
python字符串,数值计算
Oct 05 #Python
python制作企业邮箱的爆破脚本
Oct 05 #Python
python爬取NUS-WIDE数据库图片
Oct 05 #Python
python2.7的编码问题与解决方法
Oct 04 #Python
Python Sqlite3以字典形式返回查询结果的实现方法
Oct 03 #Python
Python实现屏幕截图的代码及函数详解
Oct 01 #Python
Python爬取APP下载链接的实现方法
Sep 30 #Python
You might like
PHP读取网页文件内容的实现代码(fopen,curl等)
2011/06/23 PHP
php实现的日历程序
2015/06/18 PHP
php反射学习之不用new方法实例化类操作示例
2019/06/14 PHP
[转]JS宝典学习笔记
2007/02/07 Javascript
可实现多表单提交的javascript函数
2007/08/01 Javascript
一段实现页面上的图片延时加载的js代码
2010/02/11 Javascript
利用jQuery实现可以编辑的表格
2014/05/26 Javascript
jQuery学习笔记之 Ajax操作篇(三) - 过程处理
2014/06/23 Javascript
js取得html iframe中的元素和变量值
2014/06/30 Javascript
js获取元素下的第一级子元素的方法(推荐)
2017/03/05 Javascript
详解a++和++a的区别
2017/08/30 Javascript
jQuery实现的简单无刷新评论功能示例
2017/11/08 jQuery
Angular之toDoList的实现代码示例
2017/12/02 Javascript
jQuery实现鼠标滑过商品小图片上显示对应大图片功能【测试可用】
2018/04/27 jQuery
小程序实现带年月选取效果的日历
2018/06/27 Javascript
vue使用localStorage保存登录信息 适用于移动端、PC端
2019/05/27 Javascript
js实现视图和数据双向绑定的方法分析
2020/02/05 Javascript
Vue3配置axios跨域实现过程解析
2020/11/25 Vue.js
Windows下搭建python开发环境详细步骤
2020/07/20 Python
Python处理JSON数据并生成条形图
2016/08/05 Python
python中Matplotlib实现绘制3D图的示例代码
2017/09/04 Python
python通过socket实现多个连接并实现ssh功能详解
2017/11/08 Python
pandas 使用apply同时处理两列数据的方法
2018/04/20 Python
Python向Excel中插入图片的简单实现方法
2018/04/24 Python
Python使用pyshp库读取shapefile信息的方法
2018/12/29 Python
详解利用Python scipy.signal.filtfilt() 实现信号滤波
2019/06/05 Python
StringBuilder和String的区别
2015/05/18 面试题
银行毕业实习自我鉴定
2013/09/19 职场文书
学院领导推荐信
2013/10/30 职场文书
工厂仓管员岗位职责
2014/01/01 职场文书
擅自离岗检讨书
2014/02/11 职场文书
2014幼儿园卫生保健工作总结
2014/12/05 职场文书
单位车辆管理制度
2015/08/05 职场文书
golang 实现对Map进行键值自定义排序
2021/04/28 Golang
python之基数排序的实现
2021/07/26 Python
Java中Dijkstra(迪杰斯特拉)算法
2022/05/20 Java/Android