CPython2.7.2のWindowsでのmultiprocessingの動作

Posted on 2011-12-29

フォークが出来るOSであれば、単純にフォークをしてそのあとにProcess._bootstrapProcess.run を呼び出すだけですが、Windowsではプロセスをフォークすることが出来ないので、まっさらなプロセスを立ち上げることになります。このため、ドキュメンテーションに書いてあるとおり、グローバルな変数の中身は親プロセスと違うものになります。また、Windowsではpy2exeのように実行ファイル化されたりします。

Windowsにおける multiprocessing モジュールの動きは次のようなものになります:

  1. pipeを作っておく。
  2. 現在の実行ファイルに --multiprocessing-fork というコマンドラインオプションと先ほどのpipeの読み出し側をつけて CreateProcess する。
  3. 親プロセスはpipeを通じて、 Process オブジェクトを pickle で直列化して子プロセスに送る。
  4. 子プロセスは --multiprocessing-fork をフラグとして認識して、pipeからProcess オブジェクトを読み出す。
  5. 子プロセスが Process._bootstrap を呼び出す。

Freezeされていない場合は、過程2のところでは、実行ファイルが python.exe になるので、-cオプションで過程4を実行するようなプログラムを指定します。Freezeされている場合は、-cのようなオプションを受け取れないので、multiprocessing.freeze_support がそのような役割を果たします。これがFreezeされている場合に multiprocessing.freeze_support が必要になる理由です。

Disclaimer: The opinions stated here are my own, not necessarily those of my company.