繁体   English   中英

如何在多处理 function 中传递参数以及如何使用多处理列表?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM