簡體   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