信号由儿童处理,但不由父进程处理?

时间:2014-01-14 13:42:19

标签: python signals

我产生了几个multiprocessing.Process es以将工作负载分配到不同的proc上。 现在我希望能够通过按Ctrl-C关闭整个程序,但信号只发送给子节点而不是父进程。

我的程序看起来像这样:

import sys
import multiprocessing
import signal

# ignoring handler, signal.SIG_IGN is not working on windows
def sighandler(signal, frame):
    pass    

# worker thread definiton
def worker():
    signal.signal(signal.SIGINT, sighandler)
    signal.signal(signal.SIGTERM, sighandler)

    # do stuff here...

def main():
    num_procs = 4
    procs = []
    print("Starting up %d processes:" %num_procs)
    for i in range(num_procs):
        print("\tstarting worker %d..." %(i+1))
        p = multiprocessing.Process(target=worker)
        procs.append(p)
        p.start()

    print("All processes started...")
    try:
        for p in procs:
            p.join()
    except KeyboardInterrupt as e:
        print "STOPPING"

        for p in procs:
            p.terminate()

        sys.exit(0)

但是如果按ctrl-c,只会调用sighandler 4次。当我在父进程中注册信号时,不调用处理程序,也不调用KeyboardInterrupt异常。 我可以从里面停止孩子的过程吗?处理程序中的sys.exit(0)对我不起作用。

1 个答案:

答案 0 :(得分:0)

您是否尝试过使用os._exit(n)

来自文档:

  

退出状态为n的进程,不调用清理处理程序,刷新stdio缓冲区等。

     

可用性:Unix,Windows。

     

注意退出的标准方法是sys.exit(n)。通常只应在fork()之后的子进程中使用_exit()。

http://docs.python.org/2/library/os.html#os._exit