在python3中优雅地退出多进程 [英] Exit multiprocesses gracefully in python3

查看:1505
本文介绍了在python3中优雅地退出多进程的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在Ctrl + C/SIGINT或用户输入上正常退出程序.如果可能的话,终端应该提示类似的内容; 点击进入以终止."

I would like to exit the program gracefully on Ctrl+C / SIGINT or on user input. If possible the terminal should prompt something like; "Hit enter to terminate".

要由Python 3.6执行的代码

Code to be executed by 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()

此问题的可接受答案捕获Ctrl + C/SIGINT并在python中优雅退出多进程.不起作用,它失败并显示错误:

Accepted answer for this question Catch Ctrl+C / SIGINT and exit multiprocesses gracefully in python. Isn't working, it fail with error:

Process SpawnPoolWorker-1:
Process 0 count 1572
Process SpawnPoolWorker-2:
Process 1 count 1472
Process SpawnPoolWorker-3:
Traceback (most recent call last):

任何帮助将不胜感激.谢谢!

Any help would be appreciated. Thanks!

推荐答案

您需要确保SIGINT被子进程忽略.

You need to make sure the SIGINT is ignored by the children processes.

然后,您只需等待用户输入或发出CTRL + C.

Then you just either wait for user input or for a CTRL+C to be issued.

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!")

这篇关于在python3中优雅地退出多进程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆