前言
经过前一篇博客的学习了解了 Unix 和 Windows 系统创建进程的方式了,对于 Unix系统来说,会把父进程的数据直接拷贝一份到子进程的内存空间;而 Windows 系统会重新加载一遍父进程的代码.
那么在 python 中怎么创建进程呢?其实也是调用了操作系统提供的接口,像 Unix 是 fork 接口, Windows 是 CreateProcess 接口.
python 进程
Process 源码探析
首先不管怎么创建进程都是调用了一个multiprocessing模块里面的 Process 类,学习一个模块第一件事就是查看源码.(ps: 对我来说看源码很爽😋)因为 python3看不到源码,所以用 python2可以看到:

翻译 Process 类的注释:进程对象表示在隔开的进程中运行的活动,这个类和 threading.Thread 同义.(因为最开始的计算机都是单核,多进程是后面才出来的)
那么很显然,因为 Process 是个类,那么想要创建一个进程就是实例化一个 Process 类的对象.查看__ init__方法:

哇,参数好多啊,不过大部分都可以使用默认值,第一个参数是 group, 看后面有一句注释: group 参数当前必须为 None, 好了可以不用理会了;第二个参数很重要,表示创建的进程将要进行的任务,必须要传参数(函数名);第三个是名字,可以自定义进程名;第四个是可变长参数,参数会在创建进程的时候传进 target 中;第五个为关键词参数,也是给 target 传的.
assert group is None断言,只有该表达式值为 True 才会运行下面的代码.很显然不用管就行.
然后下面的都是一些类属性,需要关注的是 self._target,sekf._popen.
查看 process 模块的注释:

翻译可知:
模块提供 Process 类是模拟于'threading.Thread'
再分配和使用的源代码和二进制形式,无论有无修改,但必须符合下列的情况:
1.源代码的再分发必须保留上述版权声明,此条件列表和以下免责声明。
2.二进制形式的再分发必须在随分发提供的文档和/或其他材料中复制上述版权声明,此条件列表和以下免责声明。
3.未经事先书面许可,不得使用作者姓名或任何贡献者的姓名来认可或宣传本软件衍生的产品。(ps: 这注释怎么和 process 一点关系没有😲)
开启进程的两种方式
- 实例化 Process 类
创建一个子进程的 demo 如下:
from multiprocessing import Process,current_process  def task():     print('子', current_process)      if __name__ == '__main__':     p = Process(target=task)     p.start() # 启动一个进程     print('主', current_process)注意:创建进程的代码为什么要放在 mian 下面?
这是因为在 windows 系统下创建进程会重新加载一遍父进程的代码,如果不放在 main 判断下面的话会重复执行创建进程的代码.在 类linux 系统下就不用了.创建进程后执行start方法其实就是运行传入的 task 函数:

这个类方法的注释含义为:运行在子进程中的方法,可以在子类中重写.
看看创建的子进程的运行结果:

结果会打印出主进程和子进程.
- 新建一个继承自 Process 类的子类并改写 run 方法
demo 如下:
from multiprocessing import Process,current_process  class MyProcess(Process):     def run(self):         print('子', current_process())   if __name__ == '__main__':     p = MyProcess()     p.start()     print('主', current_process())运行结果:

进程之间内存空间互相隔离
from multiprocessing import Process  x = 100 def 
                        
                        
                    