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脚本获取操作系统版本信息
Dec 17 Python
分析Python读取文件时的路径问题
Feb 11 Python
解决Tensorflow安装成功,但在导入时报错的问题
Jun 13 Python
如何在Django中设置定时任务的方法示例
Jan 18 Python
Python docx库用法示例分析
Feb 16 Python
wxPython多个窗口的基本结构
Nov 19 Python
Python实现栈和队列的简单操作方法示例
Nov 29 Python
python读取ini配置文件过程示范
Dec 23 Python
Python基础之函数基本用法与进阶详解
Jan 02 Python
tensorflow:指定gpu 限制使用量百分比,设置最小使用量的实现
Feb 06 Python
Python中flatten( ),matrix.A用法说明
Jul 05 Python
python两种获取剪贴板内容的方法
Nov 06 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
DC这些乐高系列动画电影你看过几部?
2020/04/09 欧美动漫
How do I change MySQL timezone?
2008/03/26 PHP
php checkbox复选框值的获取与checkbox默认值输出方法
2010/05/15 PHP
简单的cookie计数器实现源码
2013/06/07 PHP
PHP 伪静态技术原理以及突破原理实现介绍
2013/07/12 PHP
php计算两个日期相差天数的方法
2015/03/14 PHP
PHP下载生成的csv文件及问题总结
2015/08/06 PHP
window.onload 加载完毕的问题及解决方案(下)
2009/07/09 Javascript
JS中获取数据库中的值的方法
2013/07/14 Javascript
jQuery extend 的简单实例
2013/09/18 Javascript
通过pjax实现无刷新翻页(兼容新版jquery)
2014/01/31 Javascript
JavaScript 基本概念
2015/01/20 Javascript
JS实现带提示的星级评分效果完整实例
2015/10/30 Javascript
基于javascript实现彩票随机数生成(升级版)
2020/04/17 Javascript
JavaScript简单获取页面图片原始尺寸的方法
2016/06/21 Javascript
switch语句的妙用(必看篇)
2016/10/03 Javascript
Bootstrap整体框架之JavaScript插件架构
2016/12/15 Javascript
js的三种继承方式详解
2017/01/21 Javascript
Extjs 中的 Treepanel 实现菜单级联选中效果及实例代码
2017/08/22 Javascript
vscode下vue项目中eslint的使用方法
2019/01/13 Javascript
ionic3双击返回退出应用的方法
2019/09/17 Javascript
vue跳转页面的几种方法(推荐)
2020/03/26 Javascript
原生jQuery实现只显示年份下拉框
2020/12/24 jQuery
Python中的两个内置模块介绍
2015/04/05 Python
python实现K最近邻算法
2018/01/29 Python
np.dot()函数的用法详解
2020/01/17 Python
解决pytorch-yolov3 train 报错的问题
2020/02/18 Python
基于python代码批量处理图片resize
2020/06/04 Python
CSS3五个技巧给你的网站带来出色的效果
2009/04/02 HTML / CSS
html5新增的定时器requestAnimationFrame实现进度条功能
2018/12/13 HTML / CSS
Hotels.com中国区:好订网
2016/08/18 全球购物
香蕉共和国工厂店:Banana Republic Factory
2018/06/09 全球购物
公司综合部的成员自我评价分享
2013/11/05 职场文书
数控技校生自我鉴定
2014/04/19 职场文书
妇联主席先进事迹
2014/05/18 职场文书
《纸船和风筝》教学反思
2016/02/18 职场文书