在python3中优雅地退出多进程

Mik*_*ael 5 python multiprocessing python-3.x selenium-webdriver python-3.6

我想在 Ctrl+C / SIGINT 或用户输入时优雅地退出程序。如果可能,终端应该提示类似的东西;“按回车键终止”。

由 Python 3.6 执行的代码

def worker(process):
    i = 0
    while True:
        print('Process %d count %d' % (process, i))
        i += 1

def main():
    available_num_cores = multiprocessing.cpu_count()
    use_num_cores = available_num_cores - 1 if available_num_cores > 1 else 1

    print('Using %d cores' % use_num_cores)

    pool = multiprocessing.Pool(use_num_cores)

    for i in range(0, use_num_cores):
        pool.apply_async(worker, args=(i,))
    pool.close()
    pool.join()

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

已接受此问题的答案Catch Ctrl+C / SIGINT and exit multiprocesses gracefully in python。不工作,它失败并出现错误:

Process SpawnPoolWorker-1:
Process 0 count 1572
Process SpawnPoolWorker-2:
Process 1 count 1472
Process SpawnPoolWorker-3:
Traceback (most recent call last):
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激。谢谢!

nox*_*fox 1

您需要确保子进程忽略 SIGINT。

然后您只需等待用户输入或发出 CTRL+C 即可。

def initializer():
    """Ignore SIGINT in child workers."""
    signal.signal(signal.SIGINT, signal.SIG_IGN)


def main():
    try:
        pool = multiprocessing.Pool(use_num_cores, initializer=initializer)

        for i in range(0, use_num_cores):
            pool.apply_async(worker, args=(i,))

        pool.close()

        input("Hit enter to terminate")
    except KeyboardInterrupt:
        print("CTRL+C")
    finally:
        pool.terminate()
        pool.join()        

        print("Bye have a great time!")
Run Code Online (Sandbox Code Playgroud)