Python多重处理:父进程终止时终止守护进程的更好实现是什么?
问题描述:
我在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()
,因为我的子进程有无限的操作,但是如果我误解了,请告诉我。
答
从主要的析构函数的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?
答
为“已地址在使用”解决问题,尝试添加SO_REUSEADDR套接字选项。
谢谢。我已经有两个解决方案,但不知道哪个更好。使用SO_REUSEADDR安全吗?每次终止进程时调用main析构函数吗? – kangaroo