14

これは初心者の質問です:

クラスはオブジェクトなので、この add 関数とパラメーターの内部で呼び出されるクラスを作成できます。代入時に の内部の関数が上から下に実行されるのか、それともの外部として呼び出す必要があるpippo()のか​​ わかりません。pippox=pippo()x.dosomething()pippo

Python のマルチプロセッシング パッケージで作業する場合、大きな関数を定義してtargetへの呼び出しで引数を使用してオブジェクトをProcess()作成するか、クラスから継承して独自のプロセス クラスを作成する方がよいProcessでしょうか?

4

1 に答える 1

43

マルチプロセッシングに関する Python のドキュメント ページが「関数型」アプローチ (targetパラメーターを使用)しか示していないのはなぜかとよく疑問に思いました。おそらく、簡潔で簡潔なコード スニペットが説明目的に最適だからです。1 つの関数に収まる小さなタスクの場合、それがどのように好ましい方法であるかがわかります。

from multiprocessing import Process

def f():
    print('hello')

p = Process(target=f)
p.start()
p.join()

しかし、(複雑なタスクのために) より大きなコード編成が必要な場合は、独自のクラスを作成する方法があります。

from multiprocessing import Process

class P(Process):
    def __init__(self):
        super(P, self).__init__()
    def run(self):
        print('hello')

p = P()
p.start()
p.join()

生成された各プロセスは、マスター プロセスのメモリ フットプリントのコピーで初期化されることに注意してください。また、コンストラクター コード (つまり、 内のもの__init__()) はマスター プロセスで実行されます。内部のコードのみrun()が別のプロセスで実行されます。

したがって、プロセス (マスターまたは生成) がそのメンバー変数を変更しても、その変更は他のプロセスには反映されません。boolもちろん、これは、string、などの組み込み型にのみ当てはまりますlist。ただし、プロセス間で透過的に共有される「特別な」データ構造をmultiprocessingモジュールからインポートすることはできます (プロセス間の状態の共有を参照してください)。multiprocessing.Pipeやなどの IPC (プロセス間通信) の独自のチャネルを作成しますmultiprocessing.Queue

于 2013-06-20T18:09:17.450 に答える