2009-08-05 12 views
36
import multiprocessing 
import time 

class testM(multiprocessing.Process): 

    def __init__(self): 
     multiprocessing.Process.__init__(self) 
     self.exit = False 

    def run(self): 
     while not self.exit: 
      pass 
     print "You exited!" 
     return 

    def shutdown(self): 
     self.exit = True 
     print "SHUTDOWN initiated" 

    def dostuff(self): 
     print "haha", self.exit 


a = testM() 
a.start() 
time.sleep(3) 
a.shutdown() 
time.sleep(3) 
print a.is_alive() 
a.dostuff() 
exit() 

私はちょうど上記のコードが実際に「あなたが辞めた」とはプリントされないのだろうと思っています。私は間違って何をしていますか?もしそうなら、誰かが正常に終了する正しい方法を私に指摘するかもしれませんか? (私はprocess.terminateまたはkillを参照していません)Pythonマルチプロセッシングは優雅にどのように終了しますか?

+0

実は、このすべてのコードが、あなたを与える必要があります。

は、次のコードを試してみてください。言い換えれば、おそらく最後の8行を控えたいと思うでしょう。 – balpha

+1

注:メインスクリプトコードをガード句で保護していないため、このサンプルコードはwin32で失敗します。 'if __name__ ==" __main__ ":... – jkp

答えて

39

これは、サブプロセスと通信していないためです。シャットダウンする必要のある子プロセスにローカル変数(親プロセスのローカル)を使用しようとしています。

synchonization primativesの情報をご覧ください。どちらのプロセスでも参照可能なシグナルをセットアップする必要があります。これを済ませたら、親プロセスのスイッチをフリックし、子が死ぬのを待つ必要があります。 NameErrorでそのまま使用すると、クラスの作成時にクラスをインスタンス化しようとしているので、

import multiprocessing 
import time 

class MyProcess(multiprocessing.Process): 

    def __init__(self,): 
     multiprocessing.Process.__init__(self) 
     self.exit = multiprocessing.Event() 

    def run(self): 
     while not self.exit.is_set(): 
      pass 
     print "You exited!" 

    def shutdown(self): 
     print "Shutdown initiated" 
     self.exit.set() 


if __name__ == "__main__": 
    process = MyProcess() 
    process.start() 
    print "Waiting for a while" 
    time.sleep(3) 
    process.shutdown() 
    time.sleep(3) 
    print "Child process state: %d" % process.is_alive() 
+0

thx man、私はAPIを探していましたVALUE、私はそれが変更可能だとは思わない。これは私のアプリで素晴らしい動作します。 Thxたくさん –

+3

シャットダウンを呼び出してから3秒間待つ代わりに(シャットダウンに3秒以上かかる場合)、プロセスが完了したときにプロセスを終了することができます - > process.join() –

+0

彼の元の例:私はまったく待っていないだろう! (私はあなたが示唆したことをしたい)。 – jkp

関連する問題