2017-08-09 21 views
1

私はPythonマルチプロセッシングモジュールを使用してプロセスを作成したいので、それをより大きなスクリプトの一部にしたいと思います。 (私もそれから、他の多くのことをしたいが、今、私はこのために解決されます)私はmultiprocessing docsから最も基本的なコードをコピーして、少ししかし複数の処理コードが繰り返し実行される

すべてif __name__ == '__main__':外にそれを修正

p.join()が呼び出されるたびにと繰り返されます。

これは私のコードです:

from multiprocessing import Process 

data = 'The Data' 
print(data) 

# worker function definition 
def f(p_num): 
    print('Doing Process: {}'.format(p_num)) 

print('start of name == main ') 

if __name__ == '__main__': 
    print('Creating process') 
    p = Process(target=f, args=(data,)) 
    print('Process made') 
    p.start() 
    print('process started') 
    p.join() 
    print('process joined') 

print('script finished') 

これは私が期待したものである:

The Data 
start of name == main 
Creating process 
Process made 
process started 
Doing Process: The Data 
process joined 
script finished 

Process finished with exit code 0 

これは現実です:

The Data 
start of name == main 
Creating process 
Process made 
process started 
The Data       <- wrongly repeated line 
start of name == main   <- wrongly repeated line 
script finished     <- wrongly executed early line 
Doing Process: The Data 
process joined 
script finished 

Process finished with exit code 0 

これがifステートメントまたはp.join()またはそれ以外のもので、拡張子がであるかどうかは、が原因であるかどうかはわかりません。何か説明してもらえますかはこれを引き起こしました。なぜ

私の問題を再現できない人もいるので分かりやすいが、私は持っている。私はWindows Server 2012 R2 Datacenterを使用しており、Python 3.5.3を使用しています。

+1

マルチプロセッシングモジュールを使用すると、全く新しいpythonプロセスが作成されます。つまり、pythonスクリプトは本質的に複製されています。唯一の違いは、新しく作成されたプロセスにはターゲットメソッドがあり、そのターゲットは実行されたものです。関数定義の外にあるすべてのコードは、Pythonスクリプトが動作するのと同じ方法で実行されます。それは私の理解です。 – Peter

+2

結果を再現できません。コードは私のマシン上で正常に動作し、またhttp://www.tutorialspoint.com/execute_python_online.php?PID=0Bw_CjBb95KQMVFJETFNzZG1rX1U – aristotll

+0

@aristotll私はそれがオンラインで動作する理由をexaplainできませんが、私はここで2台のコンピュータでこれを実行し、毎回失敗します - しかし、それほど少なくない、チェックのおかげで。 –

答えて

2

Multiprocessingの方法は、各子プロセスが親スクリプトをにインポートするようなものです。 Pythonでは、スクリプトをインポートすると、関数内で定義されていないものがすべて実行されます。私が理解しているように、スクリプトのインポート(Check this SO answer here for a better understanding)のインポート時に__name__が変更されます。これは、コマンドラインでスクリプトを直接実行した場合と異なり、__name__ == '__main__'になります。このインポートでは__name__'__main__'と等しくないため、if __name__ == '__main__':のコードはサブプロセスで実行されません。

サブプロセス呼び出し中に実行したくないものは、コードのif __name__ == '__main__':セクションに移動する必要があります。これは親プロセス、つまり最初に実行するスクリプトに対してのみ実行されるためです。

これは少し役に立ちます。あなたの周りを見回して説明すると、Googleの周りにもっとリソースがあります。私は、マルチプロセッシングモジュール用の公式のPythonリソースをリンクしました。

+0

ファンタスティックな答えです。しかし、私が探していたものですが、不要な関数やモジュールを子プロセスから隠す別の方法があります時間とスペース)を除いて、 'if'ステートメントにそれらを含めたり、他の関数/クラス/モジュールなどをロードしたりすることはそれほど時間がかかりません。 –

+0

私は救われた時間が相当であるとは思わない - それは重要ではない。 – Peter

+0

さて、私は説明したようにそれを使用することに固執しています –

関連する問題