マルチプロセッシングに関する 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
。