python多进程不能始终捕获信号(ctrl+c)

2024-09-22 16:40:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我从一个父进程派生了8个子进程。这8个子进程每个都有几个线程。我使用signal.signal(signal.SIGINT, signal_hander)在每个子进程中注册signal_hander函数。但是当我按下ctrl+c时,有时只有一些子进程接收到信号,而其他进程只是挂起。为什么?如何确保所有进程都能接收到信号

import signal

def signal_hander(signum, frame):'
    # sometimes not all child processes can execute the following line when I presses ctrl+c from the terminal or use kill command to send SIGINT. How can it be?
    print(f'receive signal: {signum}')
    ...

# within every child process I do the following:
...
signal.signal(signal.SIGINT, signal_handler)
...

Tags: the函数importchildsignal信号进程线程
1条回答
网友
1楼 · 发布于 2024-09-22 16:40:32

这是一个运行进程池的示例,其中提交的每个任务都运行一个线程,该线程除了休眠外不执行任何操作5秒。一旦我确定设置了SIGINT处理程序,我就输入CTRL-C。一旦sleep完成,就会输出“接收信号”消息:

import signal
from multiprocessing import Pool
from threading import Thread

def signal_handler(signum, frame):
    print(f'receive signal: {signum}')

def set_handler():
    signal.signal(signal.SIGINT, signal_handler)
    print('handler set')

def delay():
    import time
    time.sleep(5)

def worker(x):
    t = Thread(target=delay)
    t.start()
    t.join()
    return x ** 2

def main():
    set_handler()
    # initialize each process in the pool with the handler: 
    pool = Pool(2, initializer=set_handler)
    print(pool.map(worker, (1,2)))

if __name__ == '__main__':
    main()

下面是一个使用Process实例和多线程而不是进程池的示例:

import signal
from multiprocessing import Process
from threading import Thread

def signal_handler(signum, frame):
    print(f'receive signal: {signum}')

def set_handler():
    signal.signal(signal.SIGINT, signal_handler)
    print('handler set')

def delay():
    import time
    time.sleep(5)

def worker(x):
    set_handler()
    threads = [Thread(target=delay) for _ in range(5)]
    for t in threads:
        t.start()
    for t in threads:
        t.join()
    print(x ** 2)

def main():
    set_handler()
    procs = [Process(target=worker, args=(i,)) for i in range(1, 9)]
    for p in procs:
        p.start()
    for p in procs:
        p.join()

if __name__ == '__main__':
    main()

相关问题 更多 >