Python の multiprocessing
で fork
でなくて spawn
を使う場合、どの変数が引き継がれるのかがよく分からない。
あと、freeze_support()
が何をしているのかもよく分からない。
公式ドキュメントの記述が不明確なので、ソースコードを読むしかなさそうだ。
10/31 追記: spawn された Python インタプリタは、コードを頭から実行していって freeze_support()
に当たったところで分岐し、pickle された引数を受け取って当該関数を呼び出す。したがって、標的の関数から見えるグローバル変数の状態や module の import 状況などは freeze_support()
時点のものとなる。挙動を詳しく調べようといろいろ実験したものの、結局は下の公式ドキュメントにあるように、global 変数を使わず必要なものはすべて引数として渡すという関数型プログラミングみたいな書法にするのがよさそうだ。今は動いていても、将来のバージョンで動く保証はないからね。
関係するページ:
- "multiprocessing: Programming guidelines": global 変数の利用についての注意がある
- "What can be pickled and unpickled?": 何が pickle 可能か
- "Pickle with custom classes"