多线程爬虫
Posted bug-king
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程爬虫相关的知识,希望对你有一定的参考价值。
程序运行速度---->主要是由cpu来决定。--->要想提高程序运行速度--->提高cpu的利用率--->多线程就是通过提高cpu的利用率来提高程序运行速度的。
提高cup的利用:
1.不能休息----->多线程。用多个线程让cup不断的在各个线程之间切换(这个cpu就不休息)。
多线程的特点:多个线程共享该进程的所有资源,也就是说各个线程之间的通信变得很简单。
2.让cup的每个小脑袋去做不同的事--->多进程。
多进程的特点:多个进程之间通信困难。
一、什么是程序、线程、进程?
程序:一个程序就相当于一个应用,比如qq软件。
进程:程序运行资源分配的最小单位。一个程序可以有多个进程。
线程:cpu最小的调度单位,必须依赖进程存在。线程是没有独立资源的,所有的线程共享它所在进程的资源。
二、多线程:多线程是指一个程序包含多个并行的线程来完成不同的任务。
多线程的优点:提高cup利用率。
三、threading模块的使用
1.创建线程
(1) 用threading.Thread实例化来创建
t = threading.Thread( target = 方法名, args = (,),方法的参数 )
t.start()-启动线程:让系统开辟一个线程去执行target所传入的方法。
2、查看线程的执行数量:threading.enumerate()
补充:迭代器和可迭代对象
迭代器:有__iter__和__next__()方法的对象
字符串:__getItem__
可迭代对象:有__iter__方法的对象。
可迭代对象如何转化为迭代器:iter(可迭代对象)——————>迭代器
可迭代对象都有哪些:
list
str
bytes
dict
tuple
set
文件流
文档:从 pythoneer 到 pythonista 的100个模...
链接:http://note.youdao.com/noteshare?id=2b95bb3651c21af80ca1936f8ecb1e0f&sub=635CA99241664308947C4F3BC1B5DDBF
3、创建线程的第二种方法:用线程类来创建。
用线程类创建线程的步骤:
(1)继承threading.Thread
(2)重写run方法。
class Mythread(threading.Thread): def run(): pass if __name__ =="__main__": t = Mythread()--->实例化这个线程类就相当于创建了一个线程。
t.start()---->将来就会执行这个类的run方法里面的内容。
(3)实例化这个线程类就相当于创建了一个线程。将来就会执行这个类的run方法里面的内容。
(4)当我们的类实例化的过程中要传一些参数,要改变init方法的结构的时候,必须要先调用父类的init方法。
调用父类的init方法有两种写法:
super().__init__() threading.Thread.__init__(self) class Mythread(threading.Thread): def __init__(self,time): self.time = time def run(): pass if __name__ =="__main__": time = 123 t = Mythread(time) t.start()
继承:
1.继承通过在定义类的时候,括号里写继承类的名字的方式来实现的。
B(A)
2、被继承的类成为父类,继承的类成为子类
3、子类继承父类的所有非私有的任何东西。
4、当子类和父类都有的东西,子类默认是拿自己的。
4、线程的名称:线程.name查看线程的名称
当我们不给线程起名字,默认情况下,线程的名称就是:Thread-1,Thread-2...以此类推
也可以给线程类实例化的过程传nama参数,手动起名字。
t = MyThread(name = i)
t.start()
5.线程的5中状态
看图
6、线程间对全局变量的更改是混乱的,原因也是线程的执行顺序是混乱造成。
7、线程间对公有数据不安全问题:
解决的办法:将公有数据用互斥锁保护起来。多个线程只能有一个可以访问被锁住的数据。
在代码中:
mutex = threading.Lock()--->主线程里面创建,所有的线程公用这一把锁。
在线程中,对公有数据的代码:
if mutex.acquire():---上锁 ‘‘‘ 对全局数据操作 ‘‘‘ mutex.release()---解锁 mutex.acquire(True)----多个线程到上锁的位置,会被阻塞,只有获得锁状态的线程可以进入---默认 mutex.acquire(False)---不阻塞。---不加锁的效果。
8.死锁
产生的情况有两种:
(1)同一个线程先后两次获取锁,此时就会在第二次获取锁时,产生死锁。
解决的办法:避免这种情况发生,第一次获取锁时,释放之后,在获取锁。
(2)a线程获取锁1,B线程获取锁2,a在没有释放的情况下,获取锁2,b也在没有释放锁2的情况下获取锁1.
以上是关于多线程爬虫的主要内容,如果未能解决你的问题,请参考以下文章
多线程——爬取以太坊Solidity智能合约代码的简约Python爬虫
Python爬虫编程思想(138):多线程和多进程爬虫--从Thread类继承