使用 Python 在多处理池中处理键盘中断
处理键盘中断对于有效管理并行进程至关重要。多处理库提供了一种创建可以并发执行任务的工作进程池的方法。但是,在执行这些进程期间启动键盘中断时会出现问题。
问题:
在给定的 Python 代码中,创建了一个 Pool 并尝试使用 try-except 块来处理键盘中断。然而, except 块中的相应代码永远不会执行,导致程序挂起。
<code class="python">try: results = pool.map(slowly_square, range(40)) except KeyboardInterrupt: pool.terminate() print("You cancelled the program!") sys.exit(1)</code>
原因:
此问题是由 Python 中的一个错误引起的,其中在 threading.Condition.wait() 中等待条件时,不会发送键盘中断。在多处理库中,Pool使用条件变量来等待map()操作的结果。当键盘中断发生时,条件变量 wait() 不会返回,从而阻止中断被处理。
解决方案:
要解决此问题,有一个解决方法就是指定等待结果时的超时时间。这可以通过将map()调用替换为map_async().get(timeout)来实现,其中timeout设置为一个很大的值。
<code class="python">results = pool.map_async(slowly_square, range(40)).get(9999999)</code>
通过指定超时,条件变量wait()即使键盘中断尚未处理,也会返回。这允许执行 except 块,从而能够终止池并优雅地处理中断。
以上是如何使用 Python 处理多处理池中的键盘中断?的详细内容。更多信息请关注PHP中文网其他相关文章!