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中的random()方法的使用介绍
May 15 Python
在Python的Django框架中为代码添加注释的方法
Jul 16 Python
教你用python3根据关键词爬取百度百科的内容
Aug 18 Python
python中requests爬去网页内容出现乱码问题解决方法介绍
Oct 25 Python
Python实现利用163邮箱远程关电脑脚本
Feb 22 Python
Python3爬虫全国地址信息
Jan 05 Python
Python进程间通信 multiProcessing Queue队列实现详解
Sep 23 Python
Python 单例设计模式用法实例分析
Sep 23 Python
Python 将json序列化后的字符串转换成字典(推荐)
Jan 06 Python
python爬虫使用scrapy注意事项
Nov 23 Python
python中用Scrapy实现定时爬虫的实例讲解
Jan 18 Python
用Python制作音乐海报
Jan 26 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
json的前台操作和后台操作实现代码
2012/01/20 Javascript
javascript获取作用在元素上面的样式属性代码
2012/09/20 Javascript
jQuery - css() 方法示例详解
2014/01/16 Javascript
原生js页面滚动延迟加载图片
2015/12/20 Javascript
CSS或者JS实现鼠标悬停显示另一元素
2016/01/22 Javascript
AngularJS中的Directive实现延迟加载
2016/01/25 Javascript
js实现点击图片自动提交action的简单方法
2016/10/16 Javascript
JavaScript正则表达式替换字符串中图片地址(img src)的方法
2017/01/13 Javascript
JS对象与JSON互转换、New Function()、 forEach()、DOM事件流等js开发基础小结
2017/08/10 Javascript
基于jQuery Ajax实现下拉框无刷新联动
2017/12/06 jQuery
浅谈Webpack多页应用HMR卡住问题
2019/04/24 Javascript
jQuery实现轮播图效果demo
2020/01/11 jQuery
javascript实现简易计算器功能
2020/09/23 Javascript
Python标准库与第三方库详解
2014/07/22 Python
Python标准库inspect的具体使用方法
2017/12/06 Python
python Celery定时任务的示例
2018/03/13 Python
windows下python安装pip图文教程
2018/05/25 Python
Django框架模板注入操作示例【变量传递到模板】
2018/12/19 Python
python TK库简单应用(实时显示子进程输出)
2019/10/29 Python
详解HTML5表单新增属性
2016/12/21 HTML / CSS
html5新增的定时器requestAnimationFrame实现进度条功能
2018/12/13 HTML / CSS
Hurley官方网站:扎根于海滩生活方式的全球青年文化品牌
2020/05/18 全球购物
解释一下抽象方法和抽象类
2016/08/27 面试题
幼儿园实习自我鉴定
2013/12/15 职场文书
美容院考勤制度
2014/01/30 职场文书
新员工入职感言
2014/02/01 职场文书
讲文明知礼仪演讲稿
2014/09/13 职场文书
大学生国庆节65周年演讲稿范文
2014/09/25 职场文书
区域经理岗位职责
2015/02/02 职场文书
关于成立领导小组的通知
2015/04/23 职场文书
公积金贷款承诺书
2015/04/30 职场文书
学校社团活动总结
2015/05/07 职场文书
pytorch DataLoader的num_workers参数与设置大小详解
2021/05/28 Python
Django实现WebSocket在线聊天室功能(channels库)
2021/09/25 Python
SQL SERVER存储过程用法详解
2022/02/24 SQL Server
从零开始在Centos7上部署SpringBoot项目
2022/04/07 Servers