2017-03-04 99 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套接字选项。