2010-11-24 9 views
0

他の文字列の計算に基づいて一連の文字列を生成する必要があります。これにはかなりの時間がかかります。マルチプロセッサ/マルチコアサーバで作業していますので、これらのタスクを塊に分けて別のプロセスに渡すことができると考えました。セットの生成をサブプロセスに分割するPythonとマルチプロセッシング

まず最初に、文字列の最初のリストをそれぞれ10000のチャンクに分割し、これを新しいセットを作成するプロセスに送り、ロックを取得してマスタープロセスに戻します。しかし、私のマスタープロセスのセットは空です!

ここにいくつかのコードです:

def build_feature_labels(self,strings,return_obj,l): 
    feature_labels = set() 
    for s in strings: 
     feature_labels = feature_labels.union(s.get_feature_labels()) 
    print "method: ", len(feature_labels) 
    l.acquire() 
    return_obj.return_feature_labels(feature_labels) 
    l.release() 
    print "Thread Done" 

def return_feature_labels(self,labs): 
    self.feature_labels = self.feature_labels.union(labs) 
    print "length self", len(self.feature_labels) 
    print "length labs", len(labs) 


current_pos = 0 
lock = multiprocessing.Lock() 

while current_pos < len(orig_strings): 
    while len(multiprocessing.active_children()) > threads: 
     print "WHILE: cpu count", str(multiprocessing.cpu_count()) 
      T.sleep(30) 

    print "number of processes", str(len(multiprocessing.active_children())) 
    proc = multiprocessing.Process(target=self.build_feature_labels,args=(orig_strings[current_pos:current_pos+self.MAX_ITEMS],self,lock)) 
    proc.start() 
    current_pos = current_pos + self.MAX_ITEMS 

    while len(multiprocessing.active_children()) > 0: 
     T.sleep(3) 


    print len(self.feature_labels) 

奇妙である何がマスタープロセス上のself.feature_labelsは空ですが、それは各サブプロセスから呼び出されたとき、それはアイテムを持っているa)のことです。私はここで間違ったアプローチを取っていると思います(Javaでやっていた方法です)。より良いアプローチがありますか?

ありがとうございます。

答えて

1

multiprocessing.Pipe, or Queue(または他のそのようなオブジェクト)を使用して、プロセス間でデータを渡します。パイプを使用して2つのプロセス間でデータを渡し、キューを使用して複数のプロデューサとコンシューマを許可します。

公式のドキュメントに加えて、Doug Hellman's multiprocessing tutorialには素晴らしい例があります。特に、mapreduce-type操作を実装するためにmultiprocessing.Poolを使用する方法の例があります。あなたの目的に合っているかもしれません。

+0

マルチプロセッシングキューでは、現在のすべてのキュー(Pythonリスト内)を追跡し、各サブプロセス内でqueue.put(the_set_I_created)のような処理を行ってから、マスタプロセスに移動しますキューのリストを通してq.getを呼び出してセットを取得しますか? – Stuart

+0

@Stuart:あなたはそれを考えることができますが、Doug Hellmanのチュートリアルで「マルチプロセッシング.Pool」を使って簡単な例があります。 mapreduceの例を参照してください:http://www.doughellmann.com/PyMOTW/multiprocessing/mapreduce.html – unutbu

0

なぜ機能しないのですか:マルチプロセスはプロセスを使用し、プロセスメモリは共有されません。マルチプロセッシングは、IPC用の共有メモリまたはパイプを設定できますが、明示的に行う必要があります。これは、さまざまな提案がデータをマスターに返送する方法です。

関連する問題