[英]How to pass argument in multiprocessing function and how to use multiprocessing list?
我正在尝试在 python 中使用多处理。我创建了一个 function,它将值附加到传递给该 function ( check_m_process ) 的列表中。 我正在尝试传递一个在外部定义的列表( m )。 由于普通列表变量不会在多处理 function 之外自行更新,因此我使用了多处理列表来查看使我的 function 进入列表的更改。
在执行 function 时,它显示参数错误,如下面的 output 所示,而不是传递参数。
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()
OUTPUT 错误:
处理过程 37:
追溯(最近一次通话):
文件“/usr/lib/python2.7/multiprocessing/process.py”,第 258 行,在 _bootstrap
自我运行()
运行中的文件“/usr/lib/python2.7/multiprocessing/process.py”,第 114 行
self._target(*self._args, **self._kwargs)
TypeError: check_m_process() 恰好接受 1 个参数(给定 0)
但是,上面的 function 在没有多处理的情况下执行时确实会执行check_m_process([])
。 但是当我添加一些额外的参数时,function 确实执行如下 output 所示。我对多处理 function 中的参数如何工作或者它应该如何实际传递感到困惑,就像如何通过多处理 function 传递单个参数一样。
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()
OUTPUT:
('之前-',[])
(在 function - ', [0, 1, 2, 3, 4])
因此,在执行 function 之后,我希望定义的列表 ( m ) 在执行 function 之后必须按照上面显示的 output 进行更新。
print('m outside function - ',list(m))
OUTPUT:
(在 function 之外 - ',[])
但是在打印列表m的值之后,它显示为空,而不是在开始时将变量定义为多处理列表。
有人可以帮助我了解如何在多处理 function 中传递单个参数以及如何在整个多处理 function 中使用公共列表吗? 或者有什么其他的方法可以处理吗?
对于您的第一个问题,您需要在参数处传递(m,)
(注意尾随逗号)。 这是在 Python 中创建单元素元组所需的语法。当您仅用括号括起单个项目时,不会创建元组。
对于你的第二个问题,你只需要 append 项目到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']"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.