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的Flask框架下使用sqlalchemy库的简单教程
Apr 09 Python
Python在线运行代码助手
Jul 15 Python
Python cookbook(数据结构与算法)字典相关计算问题示例
Feb 18 Python
Python 判断文件或目录是否存在的实例代码
Jul 19 Python
python 定时器每天就执行一次的实现代码
Aug 14 Python
Python collections中的双向队列deque简单介绍详解
Nov 04 Python
Python文件操作函数用法实例详解
Dec 24 Python
keras Lambda自定义层实现数据的切片方式,Lambda传参数
Jun 11 Python
Pycharm安装python库的方法
Nov 24 Python
python mongo 向数据中的数组类型新增数据操作
Dec 05 Python
Python爬虫新手入门之初学lxml库
Dec 20 Python
解决pytorch读取自制数据集出现过的问题
May 31 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提交后跳转
2013/06/23 PHP
Yii控制器中操作视图js的方法
2016/07/04 PHP
详解如何在云服务器上部署Laravel
2017/06/30 PHP
TP5框架实现一次选择多张图片并预览的方法示例
2020/04/04 PHP
javascript基础的动画教程,直观易懂
2007/01/10 Javascript
js获取元素外链样式的方法
2015/01/27 Javascript
详细解读AngularJS中的表单验证编程
2015/06/19 Javascript
如何解决vue与传统jquery插件冲突
2017/03/20 Javascript
vue实现手机号码抽奖上下滚动动画示例
2017/10/18 Javascript
vue19 组建 Vue.extend component、组件模版、动态组件 的实例代码
2019/04/04 Javascript
D3.js(v3)+react 实现带坐标与比例尺的散点图 (V3版本)
2019/05/09 Javascript
Nuxt.js 静态资源和打包的操作
2020/11/06 Javascript
如何在 Vue 表单中处理图片
2021/01/26 Vue.js
python之wxPython应用实例
2014/09/28 Python
Python中input与raw_input 之间的比较
2017/08/20 Python
python实现图片处理和特征提取详解
2017/11/13 Python
python list元素为tuple时的排序方法
2018/04/18 Python
详解python中的Turtle函数库
2018/11/19 Python
python使用Plotly绘图工具绘制气泡图
2019/04/01 Python
Python3.6实现带有简单界面的有道翻译小程序
2019/04/16 Python
python导入pandas具体步骤方法
2019/06/23 Python
Python实用库 PrettyTable 学习笔记
2019/08/06 Python
Python上下文管理器用法及实例解析
2019/11/11 Python
python画蝴蝶曲线图的实例
2019/11/21 Python
django自定义非主键自增字段类型详解(auto increment field)
2020/03/30 Python
服务器端jupyter notebook映射到本地浏览器的操作
2020/04/14 Python
如何解决pycharm调试报错的问题
2020/08/06 Python
python与js主要区别点总结
2020/09/13 Python
Pure Collection美国官网:来自英国羊绒专家的奢华羊绒
2017/11/19 全球购物
技术合作协议书范本
2014/04/18 职场文书
尊老爱幼演讲稿
2014/09/04 职场文书
《周恩来的四个昼夜》观后思想汇报范文两篇
2014/09/10 职场文书
2014领导班子正风肃纪思想汇报
2014/09/18 职场文书
幼儿园大班见习报告
2014/10/31 职场文书
法律服务所工作总结
2015/08/10 职场文书
HTML5+CSS+JavaScript实现捉虫小游戏设计和实现
2021/10/16 HTML / CSS