1. 线程
- GIL Global interpreter lock(cpython)
- Python中一个线程对应C语言中的一个线程
- GIL使得同一个时刻只有一个线程在一个CPU上执行字节码,无法将多个线程映射到多个CPU上执行
- GIL会根据执行的字节码行数以及时间片释放GIL,GIL在遇到IO操作时主动释放
1.1 线程间的通信
- 共享变量
- Queue:Queue是阻塞的,当Queue为空时,Queue.get()会一直等待,当Queue满时,Queue.put()会一直等待,直到有空才会传数值。
1.2 线程间的锁
- Lock
- RLock
- Condition
- Semaphore(用于控制进入数量的锁)
1.3 线程池
concurrent.futures.ThreadPoolExecutor
2. 进程
耗CPU的操作,用多进程编程,对于IO操作来说,使用多线程编程,进程切换代价要高于线程。
对于耗费CPU的操作,多进程优于多线程
对于IO操作来说,多线程优于多进程
2.1 进程间的通信
- 使用multiprocessing. Manage().Queue(). from multiprocessing import Process, Manager ,Queue, (和线程中的Queue不一样)
- 通过pip实现进程间通信,pip只能适用于两个进程
注意:
共享全局变量不能适用于多进程编程,可以适用于多线程
multiprocessing中的queue不能用于pool进程池,pool中的进程间通信需要使用manager中的queue。