Python 多处理 : What is the better implementation to terminate daemon process when the parent process terminated?

标签 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() 因为我的子进程有一个无限操作,但如果我误解了,请告诉我。

最佳答案

来自 python3 文档,main 的析构函数中的 process.terminate():

p.start() 打印(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?

关于Python 多处理 : What is the better implementation to terminate daemon process when the parent process terminated?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42591540/

相关文章:

python - 尝试通过运行 Tkinter 的发送进程在进程之间通过管道发送任何内容时发生管道错误

python - 对于不支持的操作数,代码返回回溯错误。看不到问题

linux - sudoers NOPASSWD 在桌面启动器脚本中无效

java - 在线Gitlab ci上安装Java

c - 选择(),轮询()或 epoll()?对于 sysfs 属性

python - 在函数中执行循环多处理的最快方法?

python - 多处理帮助。 BrokenProcessPool 错误

python - Pandas 合并数据框

python - 如何组合多个 if 条件来创建新列并在上一行中添加或减去

python - 在行 pandas python 上使用部分字符串匹配返回 DataFrame 项