在python3中优雅地退出多进程
我想在Ctrl+C/SIGINT或用户输入时优雅地退出程序。如果可能,终端应提示如下内容:;“按回车键终止” 将由Python 3.6执行的代码在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
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问题,解释了如何克服该问题: