Python 并发编程
CPU 密集型 & IO 密集型 > 线程安全 > 守护线程
多线程的工作过程(仅限于 Python)
Python 在使用多线程的时候,调用的是 c 语言的原生线程。
- 拿到公共资源
- 申请 GIL
- Python 解释器调用 OS 原生线程
- OS 操作 CPU 执行运算
- 当该线程执行时间到之后,无论运算是否已经执行完,GIL 都被要求释放
- 进而由其他进程重复上面的过程
- 等其它进程执行完后,又会切换到之前的线程(从它记录的上下文继续执行),整个过程是每个线程执行自己的运算,当执行时间到就进行切换(context switch)
进程与线程的区别(通用)
不同线程之间(同一进程中) | 不同进程之间 |
---|---|
共享同一内存空间 | 各自使用独立的内存空间 |
可以直接进行通信 | 需要借助中间代理来进行通信 |
启动速度较快 | 启动速度较慢(运行速度不具可比性) |
可以互相控制 | 只能父进程控制子进程 |
对主线程的修改可能会影响其他线程的行为 | 对父进程的修改不会影响其他子进程(除非删除) |
协程与多线程的比较
协程 | 多线程 |
---|---|
基于事件循环 | 基于线程切换(Python) |
程序自身控制子程序切换,开销低 | 需进行线程切换,开销高 |
不存在共享资源写冲突无需锁控制 | 对于共享资源存在写冲突需进行锁控制 |
一处异步处处异步 | 全同步方式编写 |