Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python3中优雅地退出多进程_Python_Python 3.x_Selenium Webdriver_Multiprocessing_Python 3.6 - Fatal编程技术网

在python3中优雅地退出多进程

在python3中优雅地退出多进程,python,python-3.x,selenium-webdriver,multiprocessing,python-3.6,Python,Python 3.x,Selenium Webdriver,Multiprocessing,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_coun

我想在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()
我接受这个问题的答案。不工作,它失败并出现错误:

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

任何帮助都将不胜感激。谢谢

您需要确保子进程忽略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!")

可能与我更新的问题重复。另外,我正在寻找一种支持用户输入的解决方案,它不仅支持ctrl+C,还支持输入,但不支持ctrl+C。“CTRL+C”是在按一下enter键后打印出来的,尽管CTRL+C是先执行的。我只是尝试了一下代码,它工作得非常完美。是否确实正确设置了信号处理程序?它在OS X和Win10上的行为似乎有所不同。在两者上都测试过,在Win10上失败,但在OS X上工作。有什么想法吗?该错误链接到一些stackoverflow问题,解释了如何克服该问题: