You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python多进程:单参数传递与共享列表使用问题求助

解决Python多进程中单个参数传递与共享列表更新的问题

咱们一步一步拆解并解决你遇到的两个核心问题:

1. 单个参数传递的 TypeError 问题

你碰到的TypeError: check_m_process() takes exactly 1 argument (0 given),本质是对multiprocessing.Processargs参数理解有误:args要求传入一个元组,而你写的args=(m)并不是元组——Python会把括号当成优先级符号,最终传递的是单个变量m,而非包含m的元组,进程调用函数时自然没有拿到参数。

解决方法很简单,给单个参数加个逗号,明确告诉Python这是一个单元素元组:

p1 = multiprocessing.Process(target=check_m_process, args=(m,))  # 注意末尾的逗号

2. 共享列表无法同步更新的问题

你在函数里用m = m + [i]的写法,是在创建新的普通列表,并把局部变量m指向了这个新列表,完全脱离了原来的multiprocessing.Manager().list()共享对象。所以你修改的只是函数内部的临时列表,外部的共享列表自然不会有变化。

要真正修改共享列表,必须直接操作原共享对象的内置方法,比如用append()逐个添加元素,或者用extend()批量添加:

def check_m_process(m):
    print('m before - ', list(m))
    for i in range(5):
        m.append(i)  # 直接修改共享列表对象
    # 也可以用extend批量添加:m.extend(range(5))
    print('m in function - ', list(m))

修正后的完整代码

把两个问题都修复后,最终代码如下:

import multiprocessing

# 定义跨进程共享列表
m = multiprocessing.Manager().list()

def check_m_process(m):
    print('m before - ', list(m))
    for i in range(5):
        m.append(i)
    print('m in function - ', list(m))

# 正确传递单个参数(单元素元组必须加逗号)
p1 = multiprocessing.Process(target=check_m_process, args=(m,))
p1.start()
p1.join()

# 验证外部共享列表的变化
print('m outside function - ', list(m))

运行结果

执行后会输出:

m before -  []
m in function -  [0, 1, 2, 3, 4]
m outside function -  [0, 1, 2, 3, 4]

可以看到外部的共享列表已经成功同步更新了。

内容的提问来源于stack exchange,提问作者David

火山引擎 最新活动