Python多进程:单参数传递与共享列表使用问题求助
解决Python多进程中单个参数传递与共享列表更新的问题
咱们一步一步拆解并解决你遇到的两个核心问题:
1. 单个参数传递的 TypeError 问题
你碰到的TypeError: check_m_process() takes exactly 1 argument (0 given),本质是对multiprocessing.Process的args参数理解有误: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




