Python多处理:当父进程终止时,终止守护进程的更好实现是什么?

时间:2017-03-04 02:56:51

标签: python linux multiprocessing

我在Ubuntu上使用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(),因为我的孩子进程有无限的操作,但如果我误解了,请告诉我。

2 个答案:

答案 0 :(得分: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?

答案 1 :(得分:0)

解决已使用的"地址"问题,请尝试添加 SO_REUSEADDR 套接字选项。