2016-11-16 14 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を定義する唯一の方法は?

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() 

は、スレッドとは異なり、プロセスがメモリ空間を共有していない、覚えておいてください:

+0

[キュー](https://docs.python.org/3/library/multiprocessing.html#pipes-and-queues)を使用してください。 –

+0

または[配列](https://docs.python.org/3.5/library/multiprocessing.html#sharing-state-between-processes) – alexpeits

答えて

5

一つの方法は、マネージャオブジェクトを使用して、それから、あなたの共有リストのオブジェクトを作成することです。 (生成されると、各プロセスはスポーンプロセスのメモリフットプリントのコピーを取得し、それを使って実行します)。したがって、IPC(プロセス間通信)の何らかの形でしか通信できません。 Pythonでは、このようなメソッドの1つはmultiprocessing.Managerで、それが公開するデータ構造です。 listまたはdict。これらはコード内で簡単に組み込みの等価物として使用されますが、フードの下ではIPCのいくつかの形式(おそらくソケット)を利用します。

+0

ありがとうございました!私はすでにマネージャオブジェクトに入れようとしましたが、実際にそれを動作させることはありませんでした... –

関連する問題