3

次のコードがある場合:

def f():
    print 'ok!'
    import sys
    sys.exit()

if __name__=='__main__':
    import billiard
    billiard.forking_enable(0)
    p = billiard.Process( target=f)
    p.start()
    while p.is_alive():
        pass

スクリプトは期待どおりに動作し、「ok!」と出力します。そしてエンディング。しかし、この行を省略しif __name__=='__main__':て次の行のインデントを解除すると、私のマシン (OS X) はおかしくなり、killall Python. ここで何が起こっているのか分かりますか?

(これを重複としてマークしている人には、他の質問が if __name__=='__main__'一般的な目的を尋ねる一方で、ここでそれを使用しないと劇的に予期しない動作が発生する理由を具体的に尋ねていることに注意してください)

4

1 に答える 1

8

fork次の行でサポートを無効にしています。

billiard.forking_enable(0)

つまり、Windows と同じように、ライブラリは (fork ではなく) 子プロセスを生成し、__main__実行するモジュールを再インポートする必要があります。fガードがない場合、子にモジュールをif __name__ ...再インポートすると、 を__main__作成するコードを再実行することになりbilliard.Process、無限ループが作成されます。

有効のままforkにすると、子プロセスでの再インポートは必要ないため、if __name__ ...ガードの有無にかかわらずすべてが正常に機能します。

于 2014-10-31T17:56:14.927 に答える