”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何在 Python 的多处理池中处理键盘中断?

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

发布于2024-12-22
浏览:624

How to Handle Keyboard Interrupts in Python\'s Multiprocessing Pool?

在Python的多处理池中处理键盘中断

在Python的多处理模块中,Pool类提供了一种在多个进程之间分配任务的便捷方法。然而,处理池中的 KeyboardInterrupt 事件可能具有挑战性,如代码片段所示:

from multiprocessing import Pool
from time import sleep
from sys import exit

def slowly_square(i):
    sleep(1)
    return i*i

def go():
    pool = Pool(8)
    try:
        results = pool.map(slowly_square, range(40))
    except KeyboardInterrupt:
        # **** THIS PART NEVER EXECUTES. ****
        pool.terminate()
        print "You cancelled the program!"
        sys.exit(1)
    print "\nFinally, here are the results: ", results

if __name__ == "__main__":
    go()

运行此代码时,按 Ctrl C 将不会触发清理过程,从而使子进程无限期地运行。要解决此问题,请考虑以下解决方法:

代码中观察到的行为是 Python bug 的结果。在 threading.Condition.wait() 中等待条件时,不会发送 KeyboardInterrupt。由于 Pool.map() 在内部使用条件等待,因此永远不会收到中断。

解决方案是使用 Pool.map_async(),它允许指定超时。通过设置足够长的超时时间(例如9999999),我们可以保证在合理的时间内触发中断。

因此,替换:

    results = pool.map(slowly_square, range(40))

with:

    results = pool.map_async(slowly_square, range(40)).get(9999999)

此解决方法提供了一种在多处理池中优雅地处理 KeyboardInterrupt 事件的方法,允许在用户取消程序时终止所有子进程。

版本声明 本文转载于:1729576640如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何在 Python 中创建类似 Cron 的调度?
    如何在 Python 中创建类似 Cron 的调度?
    Python 类 Cron 调度基于灵活表达式的调度任务的需求出现在各种环境中。虽然 cron 在许多环境中都能实现此目的,但它可能并不普遍可用或可行。在这种情况下,Python 提供了多种选项来创建您自己的类似 cron 的调度程序。使用调度库的轻量级方法如果轻量级且纯基于 Python 的解决方...
    编程 发布于2024-12-22
  • 如何防止 JDBC 应用程序中的 ORA-01000:最大打开游标错误?
    如何防止 JDBC 应用程序中的 ORA-01000:最大打开游标错误?
    管理游标和 JDBC 对象以防止 ORA-01000了解游标和 JDBC 之间的连接当数据库实例耗尽可用空间时,会发生 ORA-01000 最大打开游标错误游标。数据库上的单个游标支持每个 JDBC ResultSet。每个 JDBC Connection 可以处理多个事务,但一次只能处理一个事务。...
    编程 发布于2024-12-22
  • 我们如何有效地混淆嵌入在可执行二进制文件中的字符串?
    我们如何有效地混淆嵌入在可执行二进制文件中的字符串?
    混淆二进制代码中的字符串问题陈述混淆嵌入可执行二进制文件中的字符串对于保护加密密钥等敏感信息免遭未经授权的访问非常有价值。然而,像将字符串存储在字符数组中这样简单的方法可以在分析过程中轻松揭示其内容。解决方案为了有效地隐藏已编译二进制文件中的字符串,可以采用更复杂的方法。考虑以下示例:#includ...
    编程 发布于2024-12-22
  • Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta:列偏移的删除和恢复Bootstrap 4 在其 Beta 1 版本中引入了重大更改柱子偏移了。然而,随着 Beta 2 的后续发布,这些变化已经逆转。从 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    编程 发布于2024-12-22
  • 为什么无法将非常量左值引用绑定到 C++ 中的右值?
    为什么无法将非常量左值引用绑定到 C++ 中的右值?
    无法将非常量左值引用绑定到右值:解决方案给定的代码片段在初始化类 Foo 的对象时遇到错误在 Bar 类的构造函数中。错误消息表明非常量左值引用 (Foo f) 正在绑定到右值(调用 genValue() 的结果)。在 C 中,非常量引用参数只能引用命名的变量(左值)。然而,genValue() 的...
    编程 发布于2024-12-22
  • 除了“if”语句之外:还有什么地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    除了“if”语句之外:还有什么地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    无需强制转换即可上下文转换为 bool您的类定义了对 bool 的显式转换,使您能够在条件语句中直接使用其实例“t”。然而,这种显式转换提出了一个问题:“t”在哪里可以在不进行强制转换的情况下用作 bool?上下文转换场景C 标准指定了四种值可以根据上下文转换为的主要场景bool:语句:if、whi...
    编程 发布于2024-12-22
  • 如何在 React 中选择 DOM 元素:`document.getElementById()` 的替代方案?
    如何在 React 中选择 DOM 元素:`document.getElementById()` 的替代方案?
    如何在 React 中选择 DOM 元素? React 中 document.getElementById() 的等价物是什么在 React 中,与使用普通 JavaScript 不同,直接访问 DOM 元素是不同的。 React 使用虚拟 DOM 来有效地更新真实 DOM,这使得它与普通 Java...
    编程 发布于2024-12-22
  • 如何并行化 npm 脚本以加快开发速度?
    如何并行化 npm 脚本以加快开发速度?
    并行执行 npm 脚本在包开发中,同时执行多个依赖脚本通常是必要的。为了缓解 npm 默认行为带来的顺序执行问题,出现了一个强大的解决方案:并发。并发执行使用户能够并行运行多个 npm 脚本,确保并发操作,同时保留输出可见性。要利用此功能,请按照下列步骤操作:同时安装:利用您的首选终端,执行以下命令...
    编程 发布于2024-12-22
  • 在 Go 中如何可靠地比较函数指针是否相等?
    在 Go 中如何可靠地比较函数指针是否相等?
    检测 Go 中函数的指针相等性每周传统上,比较 ​​Go 中的两个非零函数指针涉及使用 == 或 != 运算符。然而,根据最近的变化,这种方法现在会导致错误。更改背后的基本原理函数指针相等比较的消除源于相等与同一的概念。在 Go 中,== 和 != 运算符评估值的等价性,而不是同一性。这种区别旨在防...
    编程 发布于2024-12-22
  • 如何在CSS中选择具有多个属性的元素?
    如何在CSS中选择具有多个属性的元素?
    如何在 CSS 中指定多个属性选择器在 CSS 中,可以根据多个属性选择元素。当您想要使用条件组合定位特定元素时,这会很有用。语法:要选择与多个属性值匹配的元素,请使用以下语法:[attribute1=value1] [attribute2=value2]例如,选择具有属性的输入元素name=&qu...
    编程 发布于2024-12-22
  • Go方法中`func`后面的括号表示什么?
    Go方法中`func`后面的括号表示什么?
    理解 Go 方法中 func 之后的括号在 Go 中,你可能会遇到 func 关键字后面的括号。这些表示方法,而不是函数。我们通过一个具体的例子来理解这个特性:func (v Version) MarshalJSON() ([]byte, error) { return json.Marshal...
    编程 发布于2024-12-22
  • 如何让我的 Go 程序无限期运行?
    如何让我的 Go 程序无限期运行?
    在 Go 程序中维护执行在 Go 中,主 Goroutine 作为程序的入口点。然而,一旦它终止,整个过程也会终止。这对设计为无限期运行的应用程序提出了挑战。传统方法传统上,程序通过以下方式保持主要活动状态:import "fmt" func main() { go fore...
    编程 发布于2024-12-22
  • 如何使用 jQuery 创建动态颜色渐变?
    如何使用 jQuery 创建动态颜色渐变?
    使用 jQuery 实现动态颜色淡入淡出:增强用户焦点的指南动画文本可以有效地吸引用户注意力,但是淡入背景怎么样?颜色来突出显示重要信息?使用 jQuery,这项任务变得毫不费力。使用 jQueryUI 淡入/淡出背景颜色要使用 jQuery 专门为元素的背景颜色设置动画,您需要包含 jQueryU...
    编程 发布于2024-12-22
  • 尽管代码有效,为什么 POST 请求无法捕获 PHP 中的输入?
    尽管代码有效,为什么 POST 请求无法捕获 PHP 中的输入?
    解决 PHP 中的 POST 请求故障在提供的代码片段中:action=''而不是:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"检查 $_POST数组:表单提交后使用 var_dump 检查 $_POST 数...
    编程 发布于2024-12-22
  • 如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 识别今天生日的用户使用 MySQL 确定今天是否是用户的生日涉及查找生日匹配的所有行今天的日期。这可以通过一个简单的 MySQL 查询来实现,该查询将存储为 UNIX 时间戳的生日与今天的日期进行比较。以下 SQL 查询将获取今天有生日的所有用户: FROM USERS ...
    编程 发布于2024-12-22

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3