一、multiprocessing 模块介绍
1、GIL
1、GIL 即全局解释器所(global interpreter lock),每个线程在执行时候都需要先获取GIL,保证同一时刻只有一个线程可以执行代码,即同一时刻只有一个线程使用CPU,也就是说多线程并不是真正意义上的同时执行。
2、CPython 解释器执行 Python 程序 过程:
-
设置GIL
-
切换到一个线程去运行
-
运行,直至完成指定的字节码指令,或者线程主动让出控制
-
将该线程设置为睡眠状态
-
解锁GIL
-
重复以上所有步骤,运行下一个线程
3、Python 程序在 CPython 解释器运行过程图:
结论:
1、由于 GIL 的存在,python程序在 CPython 解释器中运行的多线程无法利用多核优势。
2、GIL 并不是 Python 的特性,它是在实现 Python 解析器(CPython)时所引入的一个概念。但是由于 CPython 是大部分环境下默认的 Python 执行环境。所以在很多人的概念里CPython就是Python,也就想当然的把 GIL 归结为 Python 语言的缺陷。
2、关于 multiprocessing 模块
1、Python提供的multiprocessing 模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似。
2、multiprocessing模块的功能众多:支持子进程、通信和共享数据、执行不同形式的同步,提供了Process、Queue、Pipe、Lock等组件。
二、Process 类的介绍
Process类是一个创建进程的类, 借助这个类, 就可以完成进程的创建。
1、进程关系
1、获取当前程序的进程和父进程
import os
def func():
print(os.getpid(), os.getppid())
func() # 3060 10232
结论:每次执行程序只有当前程序的进程pid(getpid())会改变,父进程的pid不会改变,原因是父进程是pycharm编辑器:
2、在主程序中的进程关系
from multiprocessing import Process
import os
def func():
print(os.getpid(), os.getppid())
if __name__ == '__main__':
print('main:', os.getpid(), os.getppid())
p = Process(target=func)
p.start()
# main: 14392 10232
# 11088 14392
结论 :无论程序运行多少次,主程序都是 func() 的父进程,而且主程序是pycharm的子进程。
2、参数
- group:预留参数,值始终