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使用any判断一个对象是否为空的方法
Nov 19 Python
python批量生成本地ip地址的方法
Mar 23 Python
python实现在windows下操作word的方法
Apr 28 Python
调试Python程序代码的几种方法总结
Apr 28 Python
python引入导入自定义模块和外部文件的实例
Jul 24 Python
Python判断两个对象相等的原理
Dec 12 Python
python实现音乐下载器
Apr 15 Python
Django页面数据的缓存与使用的具体方法
Apr 23 Python
Python generator生成器和yield表达式详解
Aug 08 Python
基于python分析你的上网行为 看看你平时上网都在干嘛
Aug 13 Python
Django实现前台上传并显示图片功能
May 29 Python
virtualenv隔离Python环境的问题解析
Jun 21 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
深入理解curl类,可用于模拟get,post和curl下载
2013/06/08 PHP
跟我学Laravel之请求(Request)的生命周期
2014/10/15 PHP
PHP删除指定目录中的所有目录及文件的方法
2015/02/26 PHP
微信公众平台开发之天气预报功能
2015/08/31 PHP
PHP中的使用curl发送请求(GET请求和POST请求)
2017/02/08 PHP
PHP编程实现微信企业向用户付款的方法示例
2017/07/26 PHP
PHP设计模式之简单工厂和工厂模式实例分析
2019/03/25 PHP
Javascript 个人笔记(没有整理,很乱)
2007/07/07 Javascript
javascript模版引擎-tmpl的bug修复与性能优化分析
2011/10/23 Javascript
jQuery实现字符串按指定长度加入特定内容的方法
2015/03/11 Javascript
JavaScript之AOP编程实例
2015/07/17 Javascript
详解JavaScript中localStorage使用要点
2016/01/13 Javascript
vue.js表格分页示例
2016/10/18 Javascript
微信小程序之小豆瓣图书实例
2016/11/30 Javascript
Angular2平滑升级到Angular4的步骤详解
2017/03/29 Javascript
基于layui实现高级搜索(筛选)功能
2019/07/26 Javascript
vue项目中定义全局变量、函数的几种方法
2019/11/08 Javascript
Angular8 简单表单验证的实现示例
2020/06/03 Javascript
[01:14]3.19DOTA2发布会 三代刀塔人第二代
2014/03/25 DOTA
详尽讲述用Python的Django框架测试驱动开发的教程
2015/04/22 Python
一些Python中的二维数组的操作方法
2015/05/02 Python
python检测某个变量是否有定义的方法
2015/05/20 Python
浅谈用Python实现一个大数据搜索引擎
2017/11/28 Python
Python 实现异步调用函数的示例讲解
2018/10/14 Python
django 外键model的互相读取方法
2018/12/15 Python
Python Pillow Image Invert
2019/01/22 Python
Django实现跨域的2种方法
2019/07/31 Python
python groupby 函数 as_index详解
2019/12/16 Python
解决pycharm每次打开项目都需要配置解释器和安装库问题
2020/02/26 Python
HTML5 canvas基本绘图之图形组合
2016/06/27 HTML / CSS
雅诗兰黛旗下走天然植物路线的彩妆品牌:Prescriptives
2016/08/14 全球购物
Monica Vinader官网:英国轻奢珠宝品牌
2020/02/05 全球购物
党员评议个人总结
2014/10/20 职场文书
Django项目如何正确配置日志(logging)
2021/04/29 Python
python 批量压缩图片的脚本
2021/06/02 Python
深入理解go缓存库freecache的使用
2022/02/15 Golang