什么是进程与线程
首先,要明白一点,进程包合线程,一个进程至少有一个线程,但线程是依赖于进程而存在的,所以一个线程只属于一个进程。
基本概念:
进程:
是对运行时程序的封装,是系统进行资源调度和分配的的基本单位,实现了操作系统的并发,我们的程序代码在没有运行时,它就只是程序, 但是当这些程序被调入内存执行,就会创建对应的进程被CPU调度。从理论角度看,是对正在运行的程序过程的抽象;从实现角度看,是一种数据结构,目的在于清晰地刻画动态系统的内在规律,有效管理和调度进入计算机系统主存储器运行的程序。
狭义定义:进程就是一段程序的执行过程。广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。
线程:
是进程的子任务,是CPU调度 的基本单位,实现进程内部的并发,一个程序可能包含多个功能的函数,利用多线程就可以实现多个函数同时运行。例如QQ进程里,我们可以传输大文件,在文件没有传输完成。我们仍然可以进行聊天,那么此时可以看作是两个线程,一个是传输文件,一个是 聊天,多个线程并发可以同时进行,线程互相独立,A线程可以先开始,B编程可以提前结束,A不影响B.B不影响A.各做各的路。
为什么要使用多线程爬虫
简单来说就是提高爬虫的爬取速度
所谓的多线程爬虫,指的是爬虫中的某部分程序可以并行执行,即在多条线上执行。
多线程的库是threading,我们可以通过导入threading模块使用多线程功能,定义一个类并继承threading.Thread类,将该类定义为一个线程。
在该类中,可以使用__init__(self)方法对线程进行初始化,在run(self)方法中编写该线程需要执行的程序,然后构造线程,并调用线程对象的start()方法启动对应的线程。
python爬虫多线程之queue
多线程保证线程安全就是让多个线程执行的情况和单线程一样,读的时候是不影响线程安全的,但如果对数据操作,增加或者删除,几个线程同时进行,就会发生删多或者增加多的情况,这时候为了保证线程安全,就可以加对象锁。
Queue 对象已经包含了必要的锁,
Queue是python多线程安全的队列实现,封装了数据结构中的队列,保证了线程之间使用队列同步数据不会出错。
也就是说使用Queue就不用使用锁去同步数据。
使用queue队列实现生产者消费者问题
另threading.condition也可实现生产者消费者问题。
示例:
生产者可以有多个,消费者可以有多个,但是市场容量是有一定限度的
一件产品。投放到市场上,市场需求可以看作一个箱子box,是容量限度
当小于box大小,即队列没有满full,生产者可以生产,否则等待消费者消费,生产者有生产效率,使用speed表示
当产品大于0,即队列不为空null,才可进行消费,否则就等待生产者生产
Queue的使用函数:
get():获取队列头部元素,并且把队列中该元素弹出
put(元素):插入元素到队列尾部
qsize():获取当前队列的元素个数
empty():判断队列是否为空
实例:
爬取多个页面的图片并存入电脑文件中。