参考资料
一、进程与线程
- 进程是资源分配的最小单位,一个程序至少有一个进程;线程是程序执行的最小单位,一个进程至少有一个线程。
- 进程都有自己独立的地址空间,内存,数据栈等,所以进程占用资源多。由于进程的资源独立,所以通讯不方便,只能使用进程间通讯(IPC)。
- 线程共享进程中的数据,他们使用相同的地址空间,使用线程创建快捷,创建开销比进程小。同一进程下的线程共享全局变量、静态变量等数据,所以线程通讯非常方便,但会存在数据同步与互斥的问题,如何处理好同步与互斥是编写多线程程序的难点。
- 一个进程中可以存在多个线程,在单核CPU中每个进程中同时刻只能运行一个线程,只有在多核CPU中才能存在线程并发的情况。
- 当线程需要运行但没有运行空间时,会对线程的优先级进行判断,高优先级先运行,低优先级进程让行。
二、threading-基于线程的并行
Python下,因为全局解释器锁,一个时刻只有一个线程可以执行Python代码(其他的处于等待状态)。如果想更好地利用多核计算机的计算性能,推荐使用multiprocessing或者concurrent.futures.ProcessPoolExecutor。但是如果你想同时运行多个I/O绑定任务,线程仍然是一个合适的模型。Python的多线程只有用于I/O密集型程序时效率才会有明显的提高。
代码示例
import threading |
三、multiprocessing-基于进程的并行
multiprocessing是一个用与threading模块相似API的支持产生进程的包。multiprocessing包同时提供本地和远程并发,使用子进程代替线程,有效避免全局解释器锁带来的影响。因此,multiprocessing模块允许程序员充分利用机器上的多个核心。Unix 和 Windows 上都可以运行。multiprocessing模块还引入了在threading模块中没有类似物的API。这方面的一个主要例子是Pool对象,它提供了一种方便的方法,可以跨多个输入值并行化函数的执行,跨进程分配输入数据(数据并行)。- 进程的创建方式跟线程完全一致,只不过要将
threading.Thread换成multiprocessing.Process。multiprocessing模块尽力保持了与threading模块在方法名上的一致性,示例代码可参考上面线程部分。
四、subprocess-子进程管理
subprocess 模块允许生成新的进程,连接它们的输入、输出、错误管道,并且获取它们的返回码。此模块打算代替一些老旧的模块与功能:如 os.system 与 os.spawn* 。