os.fork和multiprocessing.Process之间的行为差​​异

Hun*_*nsu 4 python fork process multiprocessing python-multiprocessing

我有这个代码:

import os

pid = os.fork()

if pid == 0:
    os.environ['HOME'] = "rep1"
    external_function()
else:
    os.environ['HOME'] = "rep2"
    external_function()
Run Code Online (Sandbox Code Playgroud)

而这段代码:

from multiprocessing import Process, Pipe

def f(conn):
    os.environ['HOME'] = "rep1"
    external_function()
    conn.send(some_data)
    conn.close()

if __name__ == '__main__':
    os.environ['HOME'] = "rep2"
    external_function()
    parent_conn, child_conn = Pipe()
    p = Process(target=f, args=(child_conn,))
    p.start()
    print parent_conn.recv()
    p.join()
Run Code Online (Sandbox Code Playgroud)

external_function通过建立在环境变量中找到的目录必要的子目录初始化一个外部程序HOME.此功能仅在每个过程中执行一次.

使用第一个示例,可以os.fork()按预期创建目录.但是使用第二个例子,multiprocessing只有rep2get创建的目录.

为什么没有第二个例子中创建两个目录rep1rep2

小智 6

您正在寻找的答案在此处详细说明.还解释了不同OS的差异.

最大的问题是forkWindows上不存在系统调用.因此,在运行Windows操作系统时,您无法使用此方法.multiprocessing是执行当前正在运行的程序的一部分的更高级别的接口.因此,它 - 像分叉一样 - 创建过程当前状态的副本.所以说,它会照顾你的程序分叉.

因此,如果可用,您可以考虑fork()使用较低级别的接口来分支程序,并将多进程库作为分叉的更高级别接口.

希望这可以帮助.

  • 请,如果其他人有与上面的用户相同的问题,这个答案不提供任何东西,除了另一个链接。如果您可以按照社区准则的要求在答案中添加相关信息,我将删除我的反对票。 (2认同)
  • 它实际上不会在 Windows 中创建当前进程的副本。否则,[此处](https://docs.python.org/2/library/multiprocessing.html#windows) 列出的所有警告都不会成为问题。有关更多详细信息,请参阅我的答案。 (2认同)