プラットフォームに応じて、マルチプロセッシングはプロセスを開始する3つの方法をサポートします。これらの開始方法は、以下のとおりです。
は
産卵は:
親プロセスは、新鮮なPythonインタプリタのプロセスを開始します。
UnixおよびWindowsで利用できます。 Windowsではデフォルトです。
フォーク:親プロセスがos.fork使用
()Pythonインタプリタをフォークします。 UNIXのみで利用できます。 Unixのデフォルトです。
プログラムが起動し、forkserver開始方法を選択は、サーバー・プロセスが開始される
forkserver。その後、新しいプロセスが必要なときはいつでも、親プロセスはサーバーに接続し、新しいプロセスをフォークするように要求します。フォークサーバープロセスはシングルスレッドなので、os.fork()を使用することは安全です。不要なリソースは継承されません。
Unixパイプ上でファイル記述子を渡すことをサポートするUnixプラットフォームで利用できます。
あなたがメインモジュールのif __name__ == '__main__'
句でset_start_method()を使用して起動方法を選択します。たとえば、
import multiprocessing as mp
def foo(q):
q.put('hello')
if __name__ == '__main__':
mp.set_start_method('spawn')
q = mp.Queue()
p = mp.Process(target=foo, args=(q,))
p.start()
print(q.get())
p.join()
また、get_context()を使用してコンテキストオブジェクトを取得することもできます。コンテキストオブジェクトは、マルチプロセッシングモジュールと同じAPIを持ち、同じプログラム内で複数の開始メソッドを使用できるようにします。
import multiprocessing as mp
def foo(q):
q.put('hello')
if __name__ == '__main__':
ctx = mp.get_context('spawn')
q = ctx.Queue()
p = ctx.Process(target=foo, args=(q,))
p.start()
print(q.get())
p.join()
これは、コンテキストオブジェクトの出所です!
コンテキストマネージャーに関するいくつかの無関係なマッチの後で、そのdocページで 'context'という単語を検索することを私が断念していない場合のみ:) – max