(四)线程 和 进程 及相关知识点
目录
一、线程和进程
(1)进程
(2)线程
(3)区别
二、串行、并发、并行
(1)串行
(2)并行
(3)并发
三、爬虫中的线程和进程
(1)GIL锁
(2)爬虫的多线程
(3)Python的多进程
一、线程和进程
(1)进程
所谓进程,就是正在运行的程序,它占用独立的内存区域
用通俗的话来说:
我们打开媒体播放器,就是打开了一个媒体播放器进程,
打开浏览器,就是打开了一个浏览器进程,
打开某软件,就是打开了某软件进程。
这三个进程之间,相互独立,互不影响。
但是,同样的由于创建和销毁进程需要分配和回收资源,
所以他们的开销较大
(2)线程
所谓线程,就是进程内的执行单元,而多个线程共享进程的内存空间。
比如,在浏览器进程中:
我们一个页面播放音乐
一个页面播放视频
一个页面正在写东西
这三个页面就是三个线程,它们共享该进程的地址空间和其他资源
(3)区别
综上,二者有不同的应用场景:
-
进程:适合需要高度隔离的任务,比如运行不同的应用程序。
-
线程:适合需要高效共享数据和并发执行的任务,比如多任务处理、并行计算。
所以,如果你明白了这个,就明白了单线程和多线程、单进程和多进程了。
(
单线程程序指的是一个进程中只有一个执行线程
多线程程序指的是在一个进程中可以同时有多个执行线程,线程共享进程的资源
单进程指的是一个程序只在一个进程中运行
多进程指的是一个程序可以启动多个独立的进程,每个进程都有自己的内存空间和资源
)
二、串行、并发、并行
(1)串行
任务按照一定的顺序依次执行,每个任务必须等待前一个任务完成后才能开始执行。
串行的概念很简单,不必多说。
即执行完一个任务,再执行一个任务。
(2)并行
多个任务同时运行(需要多核CPU支持)
比如,现在有三个任务a,b,c
并行就是
同时执行a,b,c三个任务
(3)并发
多个任务交替执行(单核CPU即可)
比如,三个任务a,b,c
并发就是
执行a一段时间,再执行b一段时间,再执行c一段时间
然后返回再执行a一段时间,……
这样的行为,可以让单核CPU看起来,也像是同时执行。
三、爬虫中的线程和进程
(1)GIL锁
GIL:互斥锁。作用就是限制多线程同时执行,保证同一时间内只有一个线程在执行。
最初,GIL锁发明是用来:
防止多个线程同时执行 Python 代码而造成数据不一致性的问题。
即,多个线程可能会同时修改共享数据,导致数据不一致
而GIL锁的出现,则可以解决这一问题。
但,这样同时又出现了新的问题:使得 Python 的多线程无法充分利用多核处理器。
即,限制了并行性,使得多个线程的执行还是会被串行化
举个例子:
比如三个任务a,b,c
串行的执行时间=线程A的执行时间+线程B的执行时间+线程C的执行时间。
并发的执行时间=线程A的执行时间+线程B的执行时间+线程C的执行时间+交换线程执行所需时间。
从这上面来看,Python的多线程实现反而不能提高工作效率,还会因交换线程所增加工作时间
(注:这个例子,就叫执行CPU密集型任务时的问题)
(2)爬虫的多线程
根据上文,由于GIL存在,在执行计算密集型任务时,多线程并不能发挥优势
那么它的优势到底在哪呢?
其优势在于IO密集型任务
比如:
在一个程序的进程中,
有些操作需要时间等待(如爬虫时,我们向服务器发起请求,此时遇到等待)
这时,多线程作用就发挥出来了,
它可以在等待的同时,去执行其他操作,从而提高整体效率。
(3)Python的多进程
对于多进程来说,每一个进程都有自己的GIL锁
所以在多核CPU下,多进程能更好的发挥多核优势
当然,这是针对计算密集型任务来说的,而对于IO密集型任务则差别不大
但从整体来看,python中多进程比多线程更有优势