0

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

最初に、文字列の最初のリストをそれぞれ 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)

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

前もって感謝します。

4

3 に答える 3

2

ワーカーのプールの使用を検討してください: http://docs.python.org/dev/library/multiprocessing.html#using-a-pool-of-workers。これにより、map-reduce スタイルで多くの作業が行われ、組み立てられた結果が返されます。

于 2010-11-24T20:56:43.893 に答える
1

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

公式ドキュメントに加えて、 DougHellmanのマルチプロセッシングチュートリアルにある素晴らしい例があります。multiprocessing.Pool特に、 mapreduceタイプの操作を実装するために使用する方法の例があります。それはあなたの目的に非常によく合うかもしれません。

于 2010-11-24T20:51:17.833 に答える
0

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

于 2010-11-24T21:53:12.743 に答える