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

标签 python process multiprocessing fork python-multiprocessing

我有这段代码:

import os

pid = os.fork()

if pid == 0:
    os.environ['HOME'] = "rep1"
    external_function()
else:
    os.environ['HOME'] = "rep2"
    external_function()

和这段代码:

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()

external_function 通过在环境变量 HOME 中找到的目录中创建必要的子目录来初始化外部程序。此函数在每个进程中只执行一次此工作。

第一个示例使用 os.fork(),目录按预期创建。但是对于使用 multiprocessing 的第二个示例,只有 rep2 中的目录被创建。

为什么第二个示例没有在 rep1rep2 中创建目录?

最佳答案

您正在寻找的答案已在详细地址 here 中找到.还有对不同操作系统之间差异的解释。

一个大问题是 fork 系统调用在 Windows 上不存在。因此,当运行 Windows 操作系统时,您不能使用此方法。 multiprocessing 是一个高级接口(interface),用于执行当前正在运行的程序的一部分。因此,它 - 就像 fork 一样 - 创建您的进程当前状态的副本。也就是说,它负责为您 fork 程序。

因此,如果可用的话,您可以考虑将 fork() 视为 fork 程序的低级接口(interface),而将 multiprocessing 库作为 fork 的高级接口(interface).

关于python - os.fork 和 multiprocessing.Process 之间的行为差​​异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24041935/

相关文章:

python - 在计算 Pandas 创建的数据框中列的平均值时指定 "skip NA"

python - 在 Google Colab 的 shell 脚本中连接命令字符串

Python 3 压缩列表解包

ruby-on-rails - 什么是 process/reaper,为什么它不起作用?

c - 如何观察父进程和子进程之间的资源争用

python - 在 python 2.7 中将参数和 manager.dict 传递给多处理池

python - 如何从重定向的 URL 下载文件?

Windows : AttributeError: Can't get attribute "abc" 上 Jupyter 中的 python 多处理

python - 不能 pickle 函数

c# - 如何检查exe应用程序何时结束?