您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

捕获Ctrl + C / SIGINT并在python中优雅退出多进程

捕获Ctrl + C / SIGINT并在python中优雅退出多进程

正确的方法来处理Ctrl+C/SIGINTmultiprocessing.Pool是:

把它放在一起:

#!/bin/env python
from __future__ import print_function

import multiprocessing
import os
import signal
import time

def run_worker(delay):
    print("In a worker process", os.getpid())
    time.sleep(delay)

def main():
    print("Initializng 2 workers")
    original_sigint_handler = signal.signal(signal.SIGINT, signal.SIG_IGN)
    pool = multiprocessing.Pool(2)
    signal.signal(signal.SIGINT, original_sigint_handler)
    try:
        print("Starting 2 jobs of 5 seconds each")
        res = pool.map_async(run_worker, [5, 5])
        print("Waiting for results")
        res.get(60) # Without the timeout this blocking call ignores all signals.
    except KeyboardInterrupt:
        print("Caught KeyboardInterrupt, terminating workers")
        pool.terminate()
    else:
        print("Normal termination")
        pool.close()
    pool.join()

if __name__ == "__main__":
    main()

正如@YakovShklarov指出的那样,在父进程中忽略信号和忽略信号之间存在时间窗口,在此期间信号可能会丢失。pthread_sigmask在父进程中使用临时阻止信号的传递可以防止信号丢失,但是在Python-2中不可用。

python 2022/1/1 18:42:40 有474人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶