Python爬虫多线程

Python爬虫多线程

基础介绍:
很多人都说因为python的GIL (GIL规定每个时刻只能有一个线程访问python虚拟机)限制,不应该用多线程,而应该用多进程。首先,这个观点是大错特错的!如果是一个IO密集型的任务,多线程肯定是work的。所谓IO密集型任务,例如:网络交互,文件的读写。这些不依赖CPU的操作我们是可以通过使用多线程来大大提高程序的效率。
Python一般通过threading库来实现多线程。threading库是对thread库进行包装后的产物。
python的thread模块是比较底层的模块(或者说轻量级),python的threading模块是对thread做了一些包装的,可以更加方便的被使用。


线程实现

  • 通过继承threading当中的Thread类
  • 然后再init里调用Thread的init方法(或者用super调用超类的构造函数),就可以完成对一个线程的初始化创建工作。
  • 然后我们可以通过重写类的run方法来定义这个线程的要做的事。
  • 创建一个这个类的对象。
  • 然后调用这个对象的start方法就让这个线程开始工作了。
  • 调用对象的join方法等待这个线程结束工作。

线程同步

有过相关线程编程经验的人都知道一般当多个线程共用一些数据的时候,我们就需要对这些线程进行同步,避免多个进程同时修改这些共用数据的时候产生错误。试想:一个线程的工作是将一个数加一,另一个线程的工作是将这个数减一,假设这个数初始值是1,那么当这两个线程同时要对这个数操作,结果呢?结果是不可预知的。因为他们对这个数的操作产生了冲突,而计算机是没法避免这种冲突的。所以我们要在写程序的时候就解决这种可能的错误,我们该怎么办呢?

上锁!所谓上锁,就是当一个线程要操作这个数据之前,把通向这个数据的“门”锁上(也就是禁止了其他语句访问这个数据),然后执行该执行的操作,当这些操作完成了,离开的时候把这个“门”再打开。当门锁上的时候,假如别的线程要操作这个数据,它就会被告知,这门里有人了,你先等着,直到其他线程操作完了,门再次打开以后,它才会继续原本的操作。


Queue

Python的Queue库,提供了线程同步机制(这个机制就类似上面说的上锁的这个流程),我们可以直接使用queue轻松实现多线程同步。

一个简单的线程同步问题,我们通常可以称之为生产者,消费者的问题。生产者负责产生数据,消费者负责对这些数据处理(消费数据),这两个“者”在程序中就可以表示为两个线程。如果使用queue,那么就是,生产者将数据放入到queue中,消费者从queue中读取数据。queue是一种先进先出的数据结构,一般来说读数据都从queue头读,写数据都从queue尾写入,所以queue非常适合在这种情况下储存数据。

经验之谈
1. 切记不要在线程中使用start这个变量名,因为Thread类中有这个方法,不然会引起overwrite错误。
2. 处理IO密集型任务时,我们得通过尝试来确定线程的数量。因为限制因素有时候是网络速度,有时候是文件IO,也有时候就是电脑性能的瓶颈了(线程数过多时,切换线程所消的时间甚至会超过实际工作时间)。

原文博客:
http://blog.csdn.net/u013787595
http://www.jianshu.com/p/86b8e78c418a?search_token=4d8e9a843325f3abd4be64fb668ec7812f760bc1f9aa7b10431fa8966453a868
代码实例:http://download.csdn.net/detail/u013787595/9216381
注:觉得非常好,积累一下

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值