文章目录

  • 多线程和多进程
  • 多线程
  • 并发和并行
  • 多线程适用场景
  • 多进程
  • python中的多进程和多线程


多线程和多进程

多线程

进程是一个可以独立运行的程序单位。
如打开一个浏览器时,就是开启了一个浏览器进程。打开一个TXT,就是开启了一个文本进程
在一个浏览器中可以通过打开多个页面,一个页面就是一个线程

进程是线程的集合
线程是操作系统进行运算调度的最小单位,是进程中的最小运行单元。
一个浏览器进程中可以同时运行多个线程,并且线程之间互不干扰。
这些线程并发或并行执行,使得浏览器可以同时运行多个任务,这就是多线程。

并发和并行

并发:就是一次执行一个线程,每个线程快速切换。
举例:处理器同一时刻只能执行一条指令。一个处理器先执行A一段时间,再执行B一段时间,再切换到A执行一段时间。
从宏观上看是同时在运行。因为处理器执行和切换的速度都非常快
从微观上看,处理器连续不断在多个线程之间进行切换和执行。同一时刻,都是只有一个线程被执行
并发通常在单处理器和多处理器中都可以存在

并行:就是同一个时刻,多个线程在多个处理器上同时执行
从微观和宏观上看,多个线程都是在同一时刻执行的。
并行只能在多处理器中存在。

多线程适用场景

多线程适用于IO密集型任务
IO密集型任务:爬虫向服务器发起请求 后,有一段时间必须等待服务其返回响应。这就是IO密集型任务
对于这种任务,启用多线程,就可以在等待的时间去处理其他线程,可以提高整体的效率。

CPU密集型任务:计算密集型任务。
这种任务的运行一直都需要处理器的参与。
这时候从一个线程切换到另一个线程不会节省整体的时间,因为计算的总量并没有变化。
此外还会因为线程之间相互切换,导致消耗的时间变长,反而降低了整体的效率。

多进程

进程是具有一定独立功能的程序在某个数据集合上的一次运动活动,是系统进行资源分配和调度的一个独立单位。
多进程就是同一时刻运行多个 进程。

python中的多进程和多线程

从整体来看,python的多进程比多线程更有优势,如果条件允许,尽可能多用多进程。
但是由于进程是系统进行资源分配和调度的一个独立单元,因此各进程之间的数据是无法进行共享的,要通过单独的机制进行实现

由于python的多线程需要获取GILGIL(全局解释器锁)相当于一个可以使用多线程的通行证,并且一个进程中只有一个GIL 因此在大多数情况下,同一个时刻都只能运行一个线程,这就使得python多线程无法发挥多核并行的优势。
对于多进程来说,每一个进程都有自己的GIL,所以在多核处理器下,多进程的运行是不会收到GIL影响的。
也就是多进程可以更好地发挥多核优势。

同时对于爬虫这种IO密集型任务来说,多进程与多线程的差别并不大。
但是对于CPU密集型任务来说,由于GIL的存在,多线程的效率可能会更低。