概念

进程-可以理解为是一个可独立运行的程序单位,比如:

  • 打开一个浏览器,就开启了一个浏览器进程
  • 打开一个文本编辑器,就开启了一个文本编辑器进程

一个进程中可以同时处理很多事情,比如: 浏览器中可以在多个选项卡中打开多个页面,每个页面干不同的事情(一个浏览页面、一个播放音乐,等)可以同时运行,互不干扰。

为什么能同时做到运行这么多的任务呢?

答:任务对应着线程的执行。

「进程」是线程的集合,是由一个或多个线程构成的,「线程」是操作系统运行运算调度的最小单位,是进程中的一个最小运行单元。

并发

指同一时刻只能有一条指令执行,但多个线程的对应的指令被快速轮换地执行,宏观上看起来多个线程在同时运行,但微观上只是这个处理器再连续不断的在多个线程之间切换和执行

在单处理器和多处理器系统中都可以存在,仅靠一个核,就可以实现并发

并行

指同一时刻有多条指令再多个处理器上同时执行,并行必须要依赖于多个处理器,不论宏观上还是微观上多个线程都是在同一时刻一起执行的。

只能在多处理器系统中存在,如果计算机处理器只有一个核就不可能实现并行

多线程使用场景

在一个程序进程中,有些操作是比较耗时或需要等待的,如:

  • 等待数据库的查询结果的返回
  • 等待网页结果的响应

使用单线程 处理器必须要等到这些操作完成之后才能继续往下执行其他操作,而这个线程在等待的过程中,处理器明显是可以用来执行其他的操作的

使用多线程 处理器就可以在某个线程等待时,去执行其他的线程,从而从整体上提高执行效率

Python 实现多线程

Python 中,实现多线程的模块叫做 threadingPython 自带的模块

加锁保护

往往为了保证数据的结果的准确性,某个线程在对数据进程操作钱,需要先加锁,这样其他的线程发现被加锁之后,就无法继续向下执行,会一直等待锁被释放,只有加锁的线程把锁释放了,其他的线程才能继续加锁并对数据做修改,修改完了再释放锁。

这样就可以确保同一时间只有一个线程操作数据,防止多个线程同时对数据执行修改,产生错误结果。

GIL 全称为 Global Interpreter Lock,译为「全局解释器锁」

在 Python 多线程下,每个线程的执行方式如下:

  • 获取 GIL
  • 执行对应线程的代码
  • 释放 GIL

The end