【发布时间】:2020-09-03 20:48:46
【问题描述】:
在 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 会采取不同的默认行为?
- 如何在我的项目中设置默认行为?
【问题讨论】:
标签: python python-3.x process operating-system python-3.8