17.1 多进程
在Python中,由于GIL的存在,我们在多线程环境下,无法充分利用多核多CPU带来的任何优势,因此,我们可以使用多进程来代替多线程,这样就可以不用受到GIL的制约。
17.1.1 进程的创建(Process类)
Python中提供了multiprocessing模块来实现进程的相关操作。
我们可以通过与创建线程类似的方式创建子进程:
- 通过Process类来创建一个子进程。
- 通过继承Process类,重写run方法来创建子进程。
注意:在Windows平台,在创建子进程时,一定要使用如下的语法:
if __name__ == "__main__":
# 创建子进程语句,例如:
p = multiprocessing.Process(target=…)
原因在于:在Windows平台上,当创建子进程时,会自动导入创建子进程的模块,因此,这样就会出现无限递归调用。为了避免这种情况,我们使用如上的判断进行限制。在Linux中无此限制。
练习:创建一个子进程,在if name == "main"平行的级别上面,输出“当前进程执行完毕”,会发现什么情况?
17.1.2 进程相关的操作
os.getpid()
os.getppid()
os.fork()
进程对象的相关操作:
run()
start()
is_alive()
name
daemon
pid
17.1.3 进程的创建(fork方法)
在Linux操作系统中,我们也可以通过os模块的fork方法来创建子进程。fork方法会返回一个数值,对于父进程,会返回子进程的id,对于父进程,会返回0。
当创建子进程后,子进程会在fork的位置,继续向下执行。
17.1.4 进程队列
进程具有独立的内存空间,因此,进程通讯不像线程通讯那样容易。
我们可以使用进程队列来完成进程之间的通讯。进程队列的用法与线程队列非常相似。