2017-03-04 101 views
1

我在Ubuntu上使用Python 3.6上的多處理來處理與另一個設備的更快通信。Python多重處理:父進程終止時終止守護進程的更好實現是什麼?

我設置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

謝謝。我已經有兩個解決方案,但不知道哪個更好。使用SO_REUSEADDR安全嗎?每次終止進程時調用main析構函數嗎? – kangaroo

回答

2

從主要的析構函數的python3文檔,process.terminate():

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

這將發送SIGTERM由子進程來處理。 或者使用p.kill()發送SIGKILL。

完整的示例在https://docs.python.org/3/library/multiprocessing.html

對於如何在你的應用程序處理SIGTERM: How to process SIGTERM signal gracefully?

+0

謝謝。我會用這個。是否有任何缺點或潛在的問題使用它? – kangaroo

+0

那麼你應該知道它不會強制子進程終止,而是發送unix信號SIGTERM,它可以被子進程以任何方式捕獲,忽略或處理。 –

+0

我創建析構函數(我將'p'替換爲'self.process')並運行terminate(),但它仍然運行。 'print(self.process,self.process.is_alive())'的結果是'' – kangaroo

0

爲「已地址在使用」解決問題,嘗試添加SO_REUSEADDR套接字選項。