他の文字列の計算に基づいて一連の文字列を生成する必要があります。これにはかなりの時間がかかります。マルチプロセッサ/マルチコアサーバで作業していますので、これらのタスクを塊に分けて別のプロセスに渡すことができると考えました。セットの生成をサブプロセスに分割する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でやっていた方法です)。より良いアプローチがありますか?
ありがとうございます。
マルチプロセッシングキューでは、現在のすべてのキュー(Pythonリスト内)を追跡し、各サブプロセス内でqueue.put(the_set_I_created)のような処理を行ってから、マスタプロセスに移動しますキューのリストを通してq.getを呼び出してセットを取得しますか? – Stuart
@Stuart:あなたはそれを考えることができますが、Doug Hellmanのチュートリアルで「マルチプロセッシング.Pool」を使って簡単な例があります。 mapreduceの例を参照してください:http://www.doughellmann.com/PyMOTW/multiprocessing/mapreduce.html – unutbu