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 相关文章推荐
Win7上搭建Cocos2d-x 3.1.1开发环境
Jul 03 Python
python字符串连接方法分析
Apr 12 Python
简单谈谈Python中的元祖(Tuple)和字典(Dict)
Apr 21 Python
Python排序搜索基本算法之希尔排序实例分析
Dec 09 Python
pandas 选择某几列的方法
Jul 03 Python
python isinstance函数用法详解
Feb 13 Python
wxpython自定义下拉列表框过程图解
Feb 14 Python
pytorch dataloader 取batch_size时候出现bug的解决方式
Feb 20 Python
详解基于Jupyter notebooks采用sklearn库实现多元回归方程编程
Mar 25 Python
python网络编程之五子棋游戏
May 14 Python
Tensorflow加载Vgg预训练模型操作
May 26 Python
python实现mean-shift聚类算法
Jun 10 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
优化NFR之一 --MSSQL Hello Buffer Overflow
2006/10/09 PHP
WordPress开发中自定义菜单的相关PHP函数使用简介
2016/01/05 PHP
PHP Laravel 上传图片、文件等类封装
2017/08/16 PHP
PHP sdk文档处理常用代码示例解析
2020/12/09 PHP
JavaScript基础知识之数据类型
2012/08/06 Javascript
JS动画效果打开、关闭层的实现方法
2015/05/09 Javascript
JavaScript知识点总结之如何提高性能
2016/01/15 Javascript
KnockoutJS 3.X API 第四章之表单value绑定
2016/10/10 Javascript
jquery 标签 隔若干行加空白或者加虚线的方法
2016/12/07 Javascript
基于bootstrap实现收缩导航条
2017/03/17 Javascript
详解vue-router2.0动态路由获取参数
2017/06/14 Javascript
在Vue组件上动态添加和删除属性方法
2018/02/23 Javascript
微信小程序使用swiper组件实现层叠轮播图
2018/11/04 Javascript
Node.js 的 GC 机制详解
2019/06/03 Javascript
layui使用form表单实现post请求页面跳转的方法
2019/09/14 Javascript
微信小程序实现拖拽功能
2019/09/26 Javascript
基于Web Audio API实现音频可视化效果
2020/06/12 Javascript
JS相册图片抖动放大展示效果的示例代码
2021/01/29 Javascript
python 性能优化方法小结
2017/03/31 Python
Python numpy实现数组合并实例(vstack,hstack)
2018/01/09 Python
python+opencv实现摄像头调用的方法
2019/06/22 Python
wxPython实现整点报时
2019/11/18 Python
Pyspark读取parquet数据过程解析
2020/03/27 Python
Python库skimage绘制二值图像代码实例
2020/04/10 Python
pycharm激活码免费分享适用最新pycharm2020.2.3永久激活
2020/11/25 Python
美国内衣第一品牌:Hanes(恒适)
2016/07/29 全球购物
澳大利亚领先的在线美容商店:Facial Co
2017/10/22 全球购物
盛大笔试题
2016/11/05 面试题
创立科技Java面试题
2015/11/29 面试题
行政助理求职自荐信
2013/10/26 职场文书
关于青春的演讲稿500字
2014/08/22 职场文书
总经理检讨书
2014/09/15 职场文书
2016年基层党支部书记公开承诺书
2016/03/25 职场文书
表扬信范文
2019/04/22 职场文书
使用nginx配置访问wgcloud的方法
2021/06/26 Servers
「SHOW BY ROCK!!」“雫シークレットマインド”组合单曲MV公开
2022/03/21 日漫