python - 如何在多处理函数中传递参数以及如何使用多处理列表?
问题描述
我正在尝试在 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:
回溯(最近一次通话最后):
_bootstrap 中的文件“/usr/lib/python2.7/multiprocessing/process.py”,第 258 行
自我运行()
运行中的文件“/usr/lib/python2.7/multiprocessing/process.py”,第 114 行
self._target(*self._args, **self._kwargs)
TypeError: 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 在函数中 - ', [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']
请注意,在我将它与 连接后,它i
不再是 a了,它只是一个常规的。使用可以避免这种情况:ListProxy
['a']
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']"
推荐阅读
- sql - SQL 格式数字有括号
- less - 如何在 Vuetify 样式中使用手写笔块级导入
- firebase - 我可以将一个孩子设置为 .write: true 而其他孩子受到限制吗?
- sql-server - 除非我重新启动 sql server,否则 SSIS 包需要永远执行
- java - 此服务器不支持 Project facet Dynamic Web Module 4.0
- c++ - 在 Ubuntu 的终端上运行 C++ 文件
- spring - 如何避免在 requestMapping 方法中使用实体造成的漏洞?
- excel - 如何将一个单元格与一个范围进行比较,如果 TRUE - 从右侧单元格复制内容?
- go - 意外的 Goroutine 行为
- python-3.x - 如何迭代 dfs 并使用组合名称附加数据