2016-06-26 26 views
0

私は別のモジュール(demo_2.py)、
を使ってサブプロセスを作成するコードを書こうとしています。Pythonマルチプロセッシングが間違った関数を使ってサブプロセスを作成する

結果は次のようになります。

Unexpected action on my code. This is a screenshot of the result

demo_1がdemo_1と負荷demo_2を実行する二つのサブプロセスを作るようです。
サブプロセスはdemo_2のみを実行します。

私は何を欠席しましたか?

demo_1.py

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
from multiprocessing import Process,Queue 
import sys 
import demo_2 as A 

def multi_process(): 
    print ("Function multi_process called!") 
    process_status_A = Queue() 
    process_status_B = Queue() 
    A_Process = Process(target = A.process_A, args = (process_status_A,)) 
    B_Process = Process(target = A.process_A, args = (process_status_B,)) 
    A_Process.start() 
    B_Process.start() 
    while True: 
     process_status_output_A = process_status_A.get() 
     process_status_output_B = process_status_B.get() 
     if process_status_output_A == 'exit' and process_status_output_B == 'exit': 
      print ("Success!") 
      break 
    process_status_A.close() 
    process_status_B.close() 
    A_Process.join() 
    B_Process.join() 
    sys.exit() 


print ("demo_1 started") 
if __name__ == "__main__": 
    multi_process() 

demo_2.py

class process_A(object): 
    def __init__(self, process_status): 
     print ("demo_2 called!") 
     process_status.put('exit') 
    def call_exit(self): 
     pass 

答えて

3
if process_status_A == 'exit' and process_status_B == 'exit': 

if process_status_A_output == 'exit' and process_status_B_output == 'exit': 

結論であるべきです。変数の命名は重要です。 とほぼ同じ(たとえば、process_status_Aおよびprocess_status_A_output)という長い変数名を使用しないでください。 変数名の区別部分を配置するとが最初にになり、変数の意味が明確になります。

ので、代わりのWindowsがos.forkを欠いているため

process_status_A_output 
process_status_B_output 

おそらく

output_A 
output_B 

を使用し、Windows上で 新しいサブプロセスが生み出されるたびに、新しいPythonインタプリタが起動し、されます呼び出し側モジュールにはがインポートされます。 したがって、あなたがサブプロセスで実行されることを望まないコードは(特に「メインモジュールの安全な輸入」の項を参照してください)"protected" inside the if-statementにする必要があります

したがって避けるために

if __name__ == "__main__": 
    print ("demo_1 started") 
    multi_process() 

を使用余分な"demo_1 started"メッセージを印刷します。

+0

これは、なぜ私のコードが決して終わらず、Linuxでのみ必要な機能を果たしているかを説明しています(macOSでテストされていない)ありがとう! –

関連する問題