簡體   English   中英

Python Multiprocessing:當父進程終止時,終止守護進程的更好的實現是什么?

[英]Python Multiprocessing: What is the better implementation to terminate daemon process when the parent process terminated?

我正在Ubuntu 3.6上的Python 3.6上使用多處理,以處理與另一台設備的更快通信。

我設置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()因為我的子進程具有無限操作,但是如果我誤解了,請告訴我。

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

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

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

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

有關如何在您的應用程序中處理SIGTERM的信息: 如何正常處理SIGTERM信號?

要解決“地址已在使用中”的問題,請嘗試添加SO_REUSEADDR套接字選項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM