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