CPython2.7.2のWindowsでのmultiprocessingの動作
Posted on 2011-12-29
フォークが出来るOSであれば、単純にフォークをしてそのあとにProcess._bootstrap
が Process.run
を呼び出すだけですが、Windowsではプロセスをフォークすることが出来ないので、まっさらなプロセスを立ち上げることになります。このため、ドキュメンテーションに書いてあるとおり、グローバルな変数の中身は親プロセスと違うものになります。また、Windowsではpy2exeのように実行ファイル化されたりします。
Windowsにおける multiprocessing
モジュールの動きは次のようなものになります:
- pipeを作っておく。
- 現在の実行ファイルに
--multiprocessing-fork
というコマンドラインオプションと先ほどのpipeの読み出し側をつけてCreateProcess
する。 - 親プロセスはpipeを通じて、
Process
オブジェクトをpickle
で直列化して子プロセスに送る。 - 子プロセスは
--multiprocessing-fork
をフラグとして認識して、pipeからProcess
オブジェクトを読み出す。 - 子プロセスが
Process._bootstrap
を呼び出す。
Freezeされていない場合は、過程2のところでは、実行ファイルが python.exe
になるので、-cオプションで過程4を実行するようなプログラムを指定します。Freezeされている場合は、-cのようなオプションを受け取れないので、multiprocessing.freeze_support
がそのような役割を果たします。これがFreezeされている場合に multiprocessing.freeze_support
が必要になる理由です。