TL;这是预期的行为吗
一点也不像Python multiprocessing with start method 'spawn' doesn't work,这是我能找到的最接近现有问题
准确地说,这里是我用来测试的MWI:
import multiprocessing as mp
def fun_computation(x, output):
acc = 0
for i in range(x):
acc += i * i
output.value = acc
def main():
shared = mp.Value("i", -1)
proc = mp.Process(target=fun_computation, args=(100, shared))
proc.start()
proc.join()
assert(shared.value >= 0)
print(shared.value)
if __name__ == "__main__":
mp.set_start_method('spawn')
main()
这是我得到的输出:
❯ python mptest.py
328350
❯ env -i python mptest.py
/usr/lib/python3.8/multiprocessing/resource_tracker.py:96: UserWarning: resource_tracker: process died unexpectedly, relaunching. Some resources might leak.
warnings.warn('resource_tracker: process died unexpectedly, '
Traceback (most recent call last):
File "mptest.py", line 19, in <module>
main()
File "mptest.py", line 14, in main
assert(shared.value >= 0)
AssertionError
❯ python -V
Python 3.8.3
这是在最新的Arch Linux安装上测试的(在撰写本文时)。我还没有在Windows上测试它,也没有访问macOS的权限。普通的python脚本(例如,调用fun_计算而不进行多处理)工作正常
抱歉,如果这个例子看起来有点复杂;真正的错误是许多系统连接在一起的副产品,但这说明了我所面临的问题
TL;这是预期的行为吗
来自python>;3.x,您可以使用multiprocessing.get_context()来获取使用多个启动方法的上下文对象:
请尝试以下解决方案:
或:
相关问题 更多 >
编程相关推荐