3

私はこのファイルを持っています(それは有用な仕事をしません、それは学習のためだけです):

import multiprocessing,sys
def parent(numproc=2):
    print ('at start')
    childs=[]
    print ('bfore Pipe')
    (parentEnd,childEnd)=multiprocessing.Pipe()
    i=0
    print ('printing i:',i)
    child=multiprocessing.Process(target=child_proc, args=(childEnd,i))
    print ('created child')
    child.start()
    print ('started child')
    print ('joining child')
    child.join()
    print ('joined child')
    print ('exeted from for i in childs')
    mins=[1,2]
    print ('task ended. result: ',min(mins))
def child_proc(pipe,name):
    pass
if __name__ == '__main__':
    parent()

この形式では、完全に実行されます。

at start
bfore Pipe
printing i: 0
created child
started child
joining child
joined child
exeted from for i in childs
task ended. result:  1

しかし、私が代わりにファイルの終わりに入れた場合

if __name__ == '__main__':
    parent()

それだけ

parent()

それは周期的に落ちます...

at start
bfore Pipe
printing i: 0
created child
started child
joining child
at start
bfore Pipe
printing i: 0
created child
started child
joining child
at start
bfore Pipe
printing i: 0
created child
started child
joining child
Traceback (most recent call last):

なぜ?!これはif句と何が違うのですか?

4

2 に答える 2

5

これはMSWindowsの問題multiprocessingです。メインモジュールは子タスクによってインポートされるため、句で保護されていないコードはif __name__ . . .再度実行され、無限ループが発生します。

于 2012-07-16T09:50:25.250 に答える
2

サブプロセスには次のものがあります__name____parents_main__そしてそれ以上ではありませ__main__ん。__name__これが、変数をテストしているときにプロセスがループしない理由です。

詳細については、メインモジュールの安全なインポートの章を参照してください。

于 2012-07-16T09:34:36.597 に答える