2016-11-16 86 views
3

我有以下問題。我寫了一個函數,它將列表作爲輸入併爲列表中的每個元素創建一個字典。然後我想把這個字典附加到一個新的列表中,所以我得到了一個字典列表。我正在嘗試爲此產生多個進程。我的問題在於,我希望不同的進程訪問字典列表,因爲它是由其他進程更新的,例如,在已經達到特定長度時打印某些內容。 我的例子是這樣的:在python的不同進程之間共享列表

import multiprocessing 

list=['A', 'B', 'C', 'D', 'E', 'F'] 

def do_stuff(element): 
    element_dict={} 
    element_dict['name']=element 
    new_list=[] 
    new_list.append(element_dict) 
    if len(new_list)>3: 
     print 'list > 3' 

###Main### 
pool=multiprocessing.Pool(processes=6) 
pool.map(do_stuff, list) 
pool.close() 

現在我的問題是,每個進程創建自己的new_list。有沒有辦法在進程之間共享列表,以便所有字典都附加到同一個列表中?或者是在函數之外定義new_list的唯一方法?

+0

使用[隊列](https://docs.python.org/3/library/multiprocessing.html#pipes-and-queues)。 –

+0

或[Array](https://docs.python.org/3.5/library/multiprocessing.html#sharing-state-between-processes) – alexpeits

回答

5

的一種方法是使用一個管理對象,並從它創建共享目錄對象:

from multiprocessing import Manager, Pool 

input_list = ['A', 'B', 'C', 'D', 'E', 'F'] 

manager = Manager() 
shared_list = manager.list() 

def do_stuff(element): 
    global shared_list 
    element_dict = {} 
    element_dict['name'] = element 
    shared_list.append(element_dict) 
    if len(shared_list) > 3: 
     print('list > 3') 

pool = Pool(processes=6) 
pool.map(do_stuff, input_list) 
pool.close() 

記住,不像線程,進程不共享內存空間。 (產生時,每個進程都會得到它自己的產卵過程的內存佔用拷貝,然後與它一起運行。)所以它們只能通過某種形式的IPC(進程間通信)進行通信。在Python中,一種這樣的方法是multiprocessing.Manager及其公開的數據結構,例如, listdict。這些代碼與其內置的等價物一樣易於使用,但在引擎蓋下可能會使用某種形式的IPC(可能是套接字)。

+0

謝謝!我試圖把一個經理對象,但沒有真正把它的工作... –