Shi*_*ite 5 python python-multiprocessing
如果我有一些 Python 代码的设置阶段很长,最终会生成进程,生成的进程是基于父进程开始时的 Python 文件还是生成时的文件?
也就是说,我启动了父 Python 进程。然后我去编辑 Python 文件并在父进程产生其他进程之前完成它们的编辑。最后,父进程产生使用这些文件中的代码的子进程。子进程会使用父进程启动时的代码吗?还是进程产生时的代码?
您问题的答案取决于操作系统。
在Linux中multiprocessing使用fork系统调用来创建子进程。结果,子进程“继承”所有Python源的字节码,并且不会重新读取源。也就是说,在 Linux 中,孩子将无法识别这些更改。
在 Windows 中使用multiprocessing创建子进程。子进程从头开始初始化自己,也就是说,它将再次读取所有源文件,包括修改过的文件。_winapi.CreateProcess
证明。
这是一个小示例,其中主进程修改了一个源文件。
somelib.py:打印出加载它的进程的进程ID。
import os
print("SomeLib loaded in process", os.getpid())
Run Code Online (Sandbox Code Playgroud)
test.py:在生成子进程之前它会修补somelib.py
from multiprocessing import Process
# somelib prints process ID and, if patched, an extra line
import somelib
def f(name):
print('hello', name)
if __name__ == '__main__':
print("The main process is patching SomeLib")
with open("somelib.py", "a+") as patch:
patch.write("\n\nprint('SomeLib is patched')")
p = Process(target=f, args=('bob',))
# Spawn the the child
p.start()
p.join()
Run Code Online (Sandbox Code Playgroud)
Linux 下的输出:
SomeLib loaded in process 70
The main process is patching SomeLib
hello bob
Run Code Online (Sandbox Code Playgroud)
somelib.py被修改了,但是孩子因为fork而忽略了它。
Windows 中的输出
SomeLib loaded in process 22512
The main process is patching SomeLib
SomeLib loaded in process 17008
SomeLib is patched
hello bob
Run Code Online (Sandbox Code Playgroud)
看?pid 17008 的子进程“重新加载”somelib.py并处理了修改后的进程。