gpt4 book ai didi

python - python3中的多处理在mac和linux上运行时得到不同的值

转载 作者:行者123 更新时间:2023-12-04 13:14:19 24 4
gpt4 key购买 nike

在 Mac 和 Linux 上运行时,Python 3 中的多处理获得不同的值。

例如,fork 时主进程中的变量值应该克隆到子进程。但经过测试,Linux 的结果与 Mac 不同。

这是代码

#!/usr/bin/env python
# coding=utf-8
import multiprocessing

test_temp = "a"


def check_value_in_other_process():
print(f"[{multiprocessing.current_process().name}] test_temp={test_temp}")


def change_value():
global test_temp
test_temp = "b"


if __name__ == '__main__':

print(f"[{multiprocessing.current_process().name}] origin test_temp={test_temp}")
change_value()
print(f"[{multiprocessing.current_process().name}] changed test_temp={test_temp}")

pool = multiprocessing.Pool(4)
pool.apply_async(func=check_value_in_other_process)
pool.close()
pool.join()

在 Linux 上,我用 Debian 9 和 CentOS 8 测试,结果是
[MainProcess] origin test_temp=a
[MainProcess] changed test_temp=b
[ForkPoolWorker-1] test_temp=b

在mac上,我用mac os 14和mac os 15测试,结果是:
[MainProcess] origin test_temp=a
[MainProcess] changed test_temp=b
[SpawnPoolWorker-2] test_temp=a

也许,差异是由 ForkPoolWorker 和 SpawnPoolWorker 引起的?

经过检查,我发现创建进程有3种方式:spawn、fork、forkserver。
所以我补充说:
multiprocessing.set_start_method('fork')

Linux 和 Mac 得到了相同的结果
但:
  • 为什么 mac 采取不同的默认行为?
  • 如何在我的项目中设置默认行为?
  • 最佳答案

    我在 macOS 10.15 和 Python 3.6.5 上看到前一个输出(你在 Linux 上看到的那个),结果他们在 Python 3.8 中改变了这个行为(你必须运行 3.8 或更高版本):

    https://docs.python.org/3/library/multiprocessing.html#contexts-and-start-methods

    Changed in version 3.8: On macOS, the spawn start method is now the default. The fork start method should be considered unsafe as it can lead to crashes of the subprocess. See bpo-33725.



    在 spawn 模式下,子进程将只继承运行进程对象 run() 方法所需的资源。特别是,父进程中不必要的文件描述符和句柄将不会被继承。在 fork 模式(Unix 的默认值)下,父进程的所有资源都由子进程继承。

    回答你的第二个问题:它是 不是 建议在 macOS 上使用 fork(如上所述),因此如果您必须在两个平台上具有完全相同的行为,请坚持使用 spawn。

    关于python - python3中的多处理在mac和linux上运行时得到不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61863082/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com