【问题标题】:Zombie process in python multiprocessing daemonpython多处理守护进程中的僵尸进程
【发布时间】:2011-09-19 16:58:22
【问题描述】:

在研究了 python 守护进程之后,这个遍历似乎是最健壮的:http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/

现在我试图在守护进程类中实现一个工作池,我认为它正在工作(我没有彻底测试过代码),除了在关闭时我得到一个僵尸进程。我已阅读我需要等待孩子的返回码,但我只是无法确切知道我需要如何执行此操作。

这里有一些代码sn-ps:

def stop(self):
    ...
    try:
        while 1:
            self.pool.close()
            self.pool.join()
            os.kill(pid, SIGTERM)
            time.sleep(0.1)
    ...

在这里,我尝试了os.killpg 和许多os.wait 方法,但没有任何改进。我还玩过closing/joiningos.kill 之前和之后的游泳池。就目前而言,这个循环永远不会结束,一旦它到达os.kill,我就会得到一个僵尸进程。 self.pool = Pool(processes=4) 出现在守护程序的 __init__ 部分。从start(self)之后执行的run(self),我将调用self.pool.apply_async(self.runCmd, [cmd, 10], callback=self.logOutput)。但是,我想在研究之前解决这个僵尸进程。

如何在守护进程中正确实现池以避免出现这种僵尸进程?

【问题讨论】:

  • 您的守护程序中有处理 SIGCHLD 的处理程序吗?
  • 不,我没有这样的处理程序。我拥有的唯一处理程序是我在runCmd() 函数中使用的超时,即signal.signal(signal.SIGALRM, self.handler)。在这里,处理程序抛出一个自定义异常,说明命令已超过分配的执行时间。为什么我需要这个处理程序?我认为多处理在pool.closepool.join 中解决了这个问题。坦率地说,我不知道进程来自哪里,因为我没有打电话给apply_async,所以我没有工人或回调线程。

标签: python daemon multiprocessing zombie-process


【解决方案1】:

如果不知道子/守护进程中发生了什么,就不可能对答案有 100% 的信心,但请考虑是否可以。由于您的子进程中有工作线程,因此您实际上需要构建一些逻辑以在收到 SIGTERM 后加入所有这些线程。否则,您的进程可能不会退出(即使退出,您也可能不会正常退出)。为此,您需要:

  • 编写一个信号处理程序,用于捕获 SIGTERM 信号并为主线程触发事件的子/守护进程中使用
  • 在子/守护进程的主线程(非常重要)中安装信号处理程序
  • SIGTERM 的事件处理程序必须向子/守护进程中的所有线程发出停止指令
  • 所有线程在完成后都必须加入()(如果您假设 SIGTERM 会自动销毁您可能必须实现此逻辑的所有内容)
  • 一旦加入并清理完所有内容,您就可以退出主线程

如果您有用于 I/O 和各种事情的线程,那么这将是一件真正的苦差事。

此外,我通过实验发现,当您使用信号处理程序时,事件侦听器的特定策略很重要。例如,如果您使用 select.select(),则必须使用超时并在超时发生时重试;否则您的信号处理程序将不会运行。如果您有一个用于事件的 Queue.Queue 对象,并且您的事件侦听器调用它的 .get() 方法,则必须使用超时,否则您的信号处理程序将不会运行。 (在 VM 中用 C 语言实现的“真实”信号处理程序会运行,但您的 Python 信号处理程序不会运行,除非您使用超时。)

祝你好运!

【讨论】:

  • 我更详细地查看了它,但我认为这不是问题所在。但是,我意识到这篇文章非常缺乏对问题的描述。如果您仍然对这个问题感兴趣,我在这里更详细地重新询问了它:stackoverflow.com/questions/6516508/…
猜你喜欢
  • 2011-11-09
  • 2023-03-10
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多