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输出当前目录下index.html文件路径的方法
Apr 28 Python
Python打印输出数组中全部元素
Mar 13 Python
解决tensorflow测试模型时NotFoundError错误的问题
Jul 27 Python
使用python对文件中的单词进行提取的方法示例
Dec 21 Python
Form表单及django的form表单的补充
Jul 25 Python
python数据类型之间怎么转换技巧分享
Aug 20 Python
python函数局部变量、全局变量、递归知识点总结
Nov 15 Python
python的time模块和datetime模块实例解析
Nov 29 Python
Windows 下python3.8环境安装教程图文详解
Mar 11 Python
python如何随机生成高强度密码
Aug 19 Python
记一次python 爬虫爬取深圳租房信息的过程及遇到的问题
Nov 24 Python
Python 详解通过Scrapy框架实现爬取百度新冠疫情数据流程
Nov 11 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
初品cakephp 入门基础
2012/02/16 PHP
phpmailer发送gmail邮件实例详解
2013/06/24 PHP
destoon实现不同会员组公司名称显示不同的颜色的方法
2014/08/22 PHP
PHP实现基本留言板功能原理与步骤详解
2020/03/26 PHP
window.onload 加载完毕的问题及解决方案(上)
2009/07/09 Javascript
Js组件的一些写法
2010/09/10 Javascript
javascript实现上传图片并预览的效果实现代码
2011/04/11 Javascript
解析dom中的children对象数组元素firstChild,lastChild的使用
2013/07/10 Javascript
javascript调试之DOM断点调试法使用技巧分享
2014/04/15 Javascript
jQuery中insertAfter()方法用法实例
2015/01/08 Javascript
jQuery插件windowScroll实现单屏滚动特效
2015/07/14 Javascript
深入解读JavaScript中的Iterator和for-of循环
2015/07/28 Javascript
微信小程序 WXDropDownMenu组件详解及实例代码
2016/10/24 Javascript
ajax 提交数据到后台jsp页面及页面跳转问题
2017/01/19 Javascript
浅谈Angular路由守卫
2017/08/26 Javascript
使用js实现将后台传入的json数据放在前台显示
2018/08/06 Javascript
详解ES6系列之私有变量的实现
2018/11/21 Javascript
antd-DatePicker组件获取时间值,及相关设置方式
2020/10/27 Javascript
vue 公共列表选择组件,引用Vant-UI的样式方式
2020/11/02 Javascript
Tornado服务器中绑定域名、虚拟主机的方法
2014/08/22 Python
Python列表append和+的区别浅析
2015/02/02 Python
Python实现的HMacMD5加密算法示例
2018/04/03 Python
Python使用Dijkstra算法实现求解图中最短路径距离问题详解
2018/05/16 Python
Python机器学习库scikit-learn安装与基本使用教程
2018/06/25 Python
pytorch实现线性拟合方式
2020/01/15 Python
Python collections.defaultdict模块用法详解
2020/06/18 Python
python为什么会环境变量设置不成功
2020/06/23 Python
canvas绘制视频封面的方法
2018/02/05 HTML / CSS
法国综合购物网站:RueDuCommerce
2016/09/12 全球购物
英国羊皮鞋类领先品牌:Just Sheepskin
2019/12/12 全球购物
小学校长汇报材料
2014/08/20 职场文书
幼儿园迎国庆65周年活动策划方案
2014/09/16 职场文书
婚礼答谢词
2015/01/04 职场文书
公司周年庆典致辞
2015/07/30 职场文书
golang elasticsearch Client的使用详解
2021/05/05 Golang
详解Redis瘦身指南
2021/05/26 Redis