Python资源跟踪程序:在clear环境中使用多处理“spawn”方法时,进程意外死亡

2024-04-19 22:53:54 发布

您现在位置:Python中文网/ 问答频道 /正文

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;这是预期的行为吗


Tags: inpyvaluemainmpprocmultiprocessingtracker
1条回答
网友
1楼 · 发布于 2024-04-19 22:53:54

来自python>;3.x,您可以使用multiprocessing.get_context()来获取使用多个启动方法的上下文对象:

请尝试以下解决方案:

if __name__ == '__main__':
    shared = mp.Value("i", -1)
    ctx = mp.get_context('spawn')
    q = ctx.Queue() #here q=100
    p = ctx.Process(target=fun_computation, args=(q,shared))
    p.start()
    print(q.get())
    p.join()

或:

if __name__ == '__main__':
    pool = multiprocessing.Pool(processes=7)
    pool.apply_async(fun_computation, args=(q,shared))
    pool.close()
    pool.join()

相关问题 更多 >