多进程中不调用python SIGTERM处理程序。

问题描述 投票:1回答:1

我复制了下面的片段来重现我在处理SIGTERM处理程序时遇到的问题。

  1. 一个主进程,有一个SIGTERM处理程序。

  2. 一个从主进程中产生的线程

  3. 从上面的线程中产生的一个子进程。

我们的目的是了解SIGTERM处理程序的工作原理。我假设SIGTERM处理程序将被生成的线程以及进程继承。有一节是死锁发生的地方(因为共享队列没有被读取)。这使得所有的进程和线程都能保持活力,因为存在死锁。

from multiprocessing import Process, Queue
from threading import Thread
import os
import sys
import signal


def sigtermHandlerNew():
    print "SIGTERM received for process: {}".format(os.getpid())
    sys.exit()


def f(q):
    print "f proc id: {}".format(os.getpid())
    q.put('X' * 1000000)


def proc_starter():
    queue = Queue()
    p = Process(target=f, args=(queue,))
    p.start()
    p.join()  # this deadlocks
    obj = queue.get()


def main():
    signal.signal(signal.SIGTERM, sigtermHandlerNew)
    print "main process id: {}".format(os.getpid())
    t = Thread(target=proc_starter)
    t.start()
    t.join()


main()

在我运行这个程序后,我将有2个进程在运行。我观察到一个奇怪的行为--当我试图使用SIGTERM()杀死任何一个进程时。$ kill -15 <proc-id>),我看到SIGTERM处理函数没有被调用,这个死锁永远存在(直到我发出SIGKILL信号)

谁能帮我理解一下为什么信号没有被进程认可?你可以直接运行这个片段。

python-2.7 multiprocessing signals signal-processing sigterm
1个回答
2
投票

当涉及到混合线程和信号时,Python 2 被几个问题所困扰,而且这通常不是一个推荐的做法。你可以在官方的 "Python 2 "中阅读一些相关信息。文件.

更深入地讲,影响您的是在Python 2中几个使用基本锁的基元不能被信号打断的事实 发出.

这个问题已经不影响Python 3了,所以我强烈建议你换一个新版本的解释器。

如果您不能以其他方式解决这个问题,一个变通的办法是设置超时来阻塞操作,如 Queue.get.

© www.soinside.com 2019 - 2024. All rights reserved.