2013-01-05 6 views
13

私は初心者のためにライブラリを使いました。私はPythonでマルチプロセッシングモジュールを使用しています。例としてimporting and using a module that uses multiprocessing without causing infinite loop on WindowsWindowsで新しいプロセスを開始すると、Pythonのマルチプロセッシングモジュールが__main__をインポートするのはなぜですか?

、私はモジュールmylibrary.py持っているとします:私はこの問題に遭遇した私は上main.pyを実行する場合

# main.py 

import mylibrary 

mylibrary.foo() 

# mylibrary.py 

from multiprocessing import Process 

class MyProcess(Process): 
    def run(self): 
     print "Hello from the new process" 

def foo(): 
    p = MyProcess() 
    p.start() 

そして、このライブラリを呼び出すメインプログラムをWindowsでは、main.pyを新しいプロセスにインポートしようとします。つまり、コードが再度実行され、プロセス生成の無限ループが発生します。私はそうのようにそれを修正することができます:

import mylibrary 

if __name__ == "__main__": 
    mylibrary.foo() 

しかし、これは初心者のためにかなり混乱して、そしてそれは必要ありませんように。また、それはそうです。新しいプロセスがmylibraryに作成されているので、なぜ新しいプロセスがmylibraryをインポートしないのですか? main.pyを変更せずにこの問題を回避する方法はありますか?

私はPython 2.7を使っています。

答えて

23

Windowsにはforkがありません。したがって、既存のプロセスと同じように新しいプロセスを作成する方法はありません。したがって、子プロセスはコードを再度実行する必要がありますが、親プロセスと子プロセスを区別する方法が必要です。__main__はそれです。

これは、ここでのドキュメントで覆われている:私はフォーク爆弾の影響を回避するために、コードを構造化する別の方法を知らないhttp://docs.python.org/2/library/multiprocessing.html#windows

+4

この回答は受け入れる必要があります。 – Marcin

+1

私は何かが不足していると確信していますが、なぜ私の質問は、子プロセスがすべてのコードを再度実行しなければならないかということです。なぜ新しいプロセスを開始したモジュールだけではないのですか? – Laura

+0

@Laura:すべてのコードを再度実行しなければなりません。なぜなら、そうでなければ、あなたのコードを持たないからです。子プロセスは完全に新しく始まり、関数が必要な場合は、コードが必要です。 –

関連する問題