首页  >  文章  >  后端开发  >  如何使用 Python 处理多处理池中的键盘中断?

如何使用 Python 处理多处理池中的键盘中断?

DDD
DDD原创
2024-10-22 16:35:02893浏览

How to Handle Keyboard Interruptions in Multiprocessing Pools with Python?

使用 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn