我正在尝试使用python中的多处理。我创建了一个函数,该函数将值附加到传递给该函数的列表 (check_m_process(。我正在尝试传递一个在外面定义的列表 (m(。由于普通列表变量不会在多处理函数之外自行更新,因此我使用多处理列表来查看对列表所做的更改。
在执行函数时,它显示参数错误,如下面的输出所示,而不是传递参数。
import multiprocessing
# common list
m = multiprocessing.Manager().list()
def check_m_process(m):
print('m before - ',list(m))
for i in range(5):
m = m + [i]
print('m in function - ',list(m))
p1 = multiprocessing.Process(target = check_m_process, args=(m))
p1.start()
p1.join()
输出错误:
工艺流程-37:
回溯(最近一次调用(:
文件 "/usr/lib/python2.7/multiprocessing/process.py",第 258 行,_bootstrap
self.run((
文件 "/usr/lib/python2.7/multiprocessing/process.py",第 114 行,正在运行
self._target(*self._args、**self._kwargs(
类型错误: check_m_process(( 正好需要 1 个参数(给定 0(
但是,上述函数在没有多处理的情况下执行时确实会执行check_m_process([])
。但是当我添加一些额外的参数时,该函数确实执行,如下面的输出所示。我对多处理函数中的参数如何工作或它实际上应该如何传递感到困惑,例如如何使用多处理函数仅传递单个参数。
def check_m_process(tmp_str,m):
print('m before - ',list(m))
for i in range(5):
m = m + [i]
print('m in function - ',list(m))
p1 = multiprocessing.Process(target = check_m_process, args=('',m))
p1.start()
p1.join()
输出:
('m before - ', [](
('m in function - ', [0, 1, 2, 3, 4](
因此,在执行函数后,我希望定义的列表 (m( 现在必须按照上面所示的输出在函数执行后更新。
print('m outside function - ',list(m))
输出:
('m 外部函数 - ', [](
但是在打印列表m的值后,它显示为空,而不是在开始时将变量定义为多处理列表。
有人可以帮助我如何在多处理函数中传递单个参数以及如何在整个多处理函数中使用公共列表吗?还是有其他方法可以处理它?
对于你的第一个问题,你需要在参数处传递(m,)
(注意尾随逗号(。这是在 Python 中创建单元素元组所需的语法。当您只用括号将单个项目括起来时,不会创建元组。
对于第二个问题,您只需将项目附加到multiprocessing.Manager().list()
,而不是重复重新分配变量:
for i in range(5):
m.append(i)
您目前的做法实际上是创建一个常规的 Python 列表,并为其分配m
,而不是更新您的multiprocessing
列表
>>> i = multiprocessing.Manager().list()
>>> i
<ListProxy object, typeid 'list' at 0x7fa18483b590>
>>> i = i + ['a']
>>> i
['a']
请注意,在我将其与['a']
连接后,i
不再是ListProxy
,它只是一个常规list
。使用append
可避免这种情况:
>>> i = multiprocessing.Manager().list()
>>> i
<ListProxy object, typeid 'list' at 0x7fa18483b6d0>
>>> i.append('a')
>>> i
<ListProxy object, typeid 'list' at 0x7fa18483b6d0>
>>> str(i)
"['a']"