1

私はマルチスレッドの経験があまりなく、以下のようなものを動作させようとしています:

from multiprocessing import Process

class Node:

    def __init__(self):
        self.children = {}

class Test(Process):

    def __init__(self, tree):
        super().__init__()
        self.tree = tree

    def run(self):
        # infinite loop which does stuff to the tree
        self.tree.children[1] = Node()
        self.tree.children[2] = Node()

x = Node()
t = Test(x)
t.start()
print(x.children)  # random access to tree

さまざまな非常に賢明な理由により、これが機能しない(そして機能しない)ことはわかっていますが、機能させる方法がわかりませ。ドキュメントを参照すると、マネージャーとプロキシで何かをする必要があるようですが、正直なところ、どこから始めればよいのか、それが実際に探しているものなのかわかりません。誰かが上記の例を提供できますか?

4

2 に答える 2

2

あなたが望むのは、マルチプロセッシングではなく、実際のマルチスレッドであるように私には思えます。プロセスではなくスレッドを使用すると、スレッドが同じプロセスで実行され、すべてのメモリ、つまりデータを相互に共有するため、正確にそれを行うことができます。

于 2013-03-21T05:41:24.643 に答える
2

multiprocessing暗黙的に共有されたオブジェクトのサポートは制限されており、リストや辞書を共有することさえできます。

一般に、 (最初のフォークの後) 何multiprocessing共有されず、プロセス間の明示的な通信に依存します。これにより、オーバーヘッドが追加されます (プロセス間の相互作用の種類によって異なります) が、マルチスレッド プログラミングの多くの落とし穴をうまく回避できます。multiprocessing優先マスター/スレーブ モデル (特にPool クラス)の高レベルのビルディング ブロック。マスターは作業項目を配布し、スレーブはそれらを操作して結果を返します。

複数のプロセス間で状態の同期を維持すると、プロセスが変更される頻度によっては、法外なオーバーヘッドが発生する可能性があります。

TL;DR : それは可能ですが、おそらくそうすべきではありません。

import time, multiprocessing

class Test(multiprocessing.Process):
    def __init__(self, manager):
        super().__init__()
        self.quit = manager.Event()
        self.dict = manager.dict()

    def stop(self):
        self.quit.set()
        self.join()

    def run(self):
        self.dict['item'] = 0
        while not self.quit.is_set():
            time.sleep(1)
            self.dict['item'] += 1

m = multiprocessing.Manager()
t = Test(m)
t.start()
for x in range(10):
    time.sleep(1.2)
    print(t.dict)
t.stop()

例は、より複雑なオブジェクトmultiprocessingのプロキシを作成する方法を示しています。これにより、質問にツリー構造を実装できるようになります。

于 2013-03-24T14:50:43.887 に答える