2017-03-04 3 views
1

私はUbuntuのPython 3.6でマルチプロセッシングを使って、他のデバイスとのより高速な通信を処理しています。Python Multiprocessing:親プロセスが終了したときのデーモンプロセスを終了するためのより良い実装は何ですか?

daemon = Trueは、親プロセスが終了したときに子プロセスを終了するように設定しました。ただし、メインプロセスが終了すると、別のプロセス(次のコードの_another_process)が終了していないことがあり、引き続き有効です。その後、同じプログラムを再度実行すると、上記のコードを実行するとaddress already in useエラーが発生します。もちろん、私はこのプロセスを殺すことができますが、それは迷惑で、私は解決したいと思います。

Class Xxx 
def __init__(self): 
     self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
     self.sock.settimeout(2.5) 
     self.sock.bind((self.ip, self.port)) 
     self.sock.settimeout(None)  
     self.start_process() 
     time.sleep(1.5) 

    def start_process(self):  
     p = mp.Process(target=self._another_process) 
     time.sleep(1) 
     p.daemon = True 
     p.start() 

    def _another_process(self): 
     while True: 
      # Do continuous (infinite) operation 

時に終了し、時にはない理由を私は知らないが、私が欲しいものを実現するために任意のより良い実装があるのですか?または、daemon = Trueが最善の方法ですか?

子プロセスに無限の操作があるので、私はjoin()を使用すべきではないと思いますが、私が誤解している場合は教えてください。メインのデストラクタで

+0

ありがとうございます。私はすでに2つの解決策を得ていますが、どちらが良いかわかりません。 SO_REUSEADDRの使用は安全ですか?メインのデストラクタはプロセスを終了するたびに呼び出されますか? – kangaroo

答えて

2
のpython3のドキュメントから

、process.terminate():

p.start() print(p, p.is_alive()) p.terminate()

これは、子プロセスによって処理されるSIGTERMを送信します。 または、p.kill()を使用してSIGKILLを送信してください。

アプリケーションにSIGTERMを処理する方法についてはhttps://docs.python.org/3/library/multiprocessing.html

で全例: How to process SIGTERM signal gracefully?

+0

ありがとうございます。私はこれを使うだろう。これを使用するにあたっての不利な点や潜在的な問題はありますか? – kangaroo

+0

それは、子プロセスが終了するよう強制するのではなく、子プロセスがどのような方法でもキャッチ、無視、または処理できるUNIXシグナルSIGTERMを送信することに注意してください。 –

+0

私はデストラクタを作成します(私は 'self.process'に' p 'を置き換えます)、terminate()を実行します。 'print(self.process、self.process.is_alive())'の結果は ')' – kangaroo

0

SO_REUSEADDRソケットオプションを追加してみてください、「すでに使用中のアドレス」問題を解決するために。

関連する問題