Python 并发编程

作者: 潘峰 / 2021-07-21 / 分类: Work

Python

Python 并发编程

CPU 密集型 & IO 密集型 > 线程安全 > 守护线程

多线程的工作过程(仅限于 Python)

Python 在使用多线程的时候,调用的是 c 语言的原生线程。

  1. 拿到公共资源
  2. 申请 GIL
  3. Python 解释器调用 OS 原生线程
  4. OS 操作 CPU 执行运算
  5. 当该线程执行时间到之后,无论运算是否已经执行完,GIL 都被要求释放
  6. 进而由其他进程重复上面的过程
  7. 等其它进程执行完后,又会切换到之前的线程(从它记录的上下文继续执行),整个过程是每个线程执行自己的运算,当执行时间到就进行切换(context switch)

进程与线程的区别(通用)

不同线程之间(同一进程中) 不同进程之间
共享同一内存空间 各自使用独立的内存空间
可以直接进行通信 需要借助中间代理来进行通信
启动速度较快 启动速度较慢(运行速度不具可比性)
可以互相控制 只能父进程控制子进程
对主线程的修改可能会影响其他线程的行为 对父进程的修改不会影响其他子进程(除非删除)

协程与多线程的比较

协程 多线程
基于事件循环 基于线程切换(Python)
程序自身控制子程序切换,开销低 需进行线程切换,开销高
不存在共享资源写冲突无需锁控制 对于共享资源存在写冲突需进行锁控制
一处异步处处异步 全同步方式编写