通过键盘中断关闭所有线程

2024-03-07

我在这里尝试做的是使用键盘中断来退出程序中所有正在进行的线程。这是我的代码的精简版本,其中创建了线程:

for i in taskDictionary:
    try:
        sleep(60)
        thread = Thread(target = mainModule.executeThread)
        thread.start()
    except KeyboardInterrupt:
        thread.__stop()

程序本身要复杂得多,考虑到影响线程的大量不同变量,甚至可以选择以顺序模式启动,其中任务不是线程化的,而是逐一启动,因此可能会出现一些问题我只是想出了这个小小的变化。 我的做法取得了 50/50 的结果。中断可以工作,但线程永远不会干净地退出。有时它们会继续运行,但会停止未来线程的执行,有时它们会因中断而出现严重错误而退出,有时中断根本不会执行任何操作。上次我运行此程序时,程序停止了任何未来线程的执行,但没有停止当前线程。 有没有办法退出线程而不进入线程实际执行的模块?


类似的问题是“如何杀死一个线程?”

您在线程中创建一个退出处理程序,该处理程序由线程模块中的锁或事件对象控制。然后,您只需删除锁或向事件对象发出信号即可。这通知线程它应该停止处理并正常退出。在主程序中向线程发出信号后,唯一要做的就是使用thread.join()中的方法main这将等待线程关闭。

一个简短的例子:

import threading
import time

def timed_output(name, delay, run_event):
    while run_event.is_set():
        time.sleep(delay)
        print name,": New Message!"


def main():
    run_event = threading.Event()
    run_event.set()
    d1 = 1
    t1 = threading.Thread(target = timed_output, args = ("bob",d1,run_event))

    d2 = 2
    t2 = threading.Thread(target = timed_output, args = ("paul",d2,run_event))

    t1.start()
    time.sleep(.5)
    t2.start()

    try:
        while 1:
            time.sleep(.1)
    except KeyboardInterrupt:
        print "attempting to close threads. Max wait =",max(d1,d2)
        run_event.clear()
        t1.join()
        t2.join()
        print "threads successfully closed"

if __name__ == '__main__':
    main()

如果您确实需要以下功能killing线程,使用多处理。它允许您将 SIGTERM 发送到各个“进程”(它也与线程模块非常相似)。一般来说,线程适用于 IO 受限的情况,而多处理适用于真正处理器受限的情况。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过键盘中断关闭所有线程 的相关文章

随机推荐

  • 使用 CodeIgniter 的动态表单生成器[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我计划为不同的表单布局构建一个动态表单 http bootsnipp com forms version 3 http bootsnipp
  • python字典中的5个最大值

    我有一本这样的字典 A a 10 b 843 c 39 我想获取这个字典的 5 个最大值并用它存储一个新的字典 为了获得最大值 我做了 max A iteritems key operator itemgetter 1 0 也许这是一件容易
  • 有没有办法强制 conda install 安装软件包及其依赖项而不是给出错误

    我有一个正在安装软件包的 miniconda 环境 我想安装一个软件包 并且我知道可能会存在一些冲突 但是要解决这些冲突 要么需要安装缺少的软件包 要么需要降级 升级另一个软件包 并且它已成为一个尝试降级 升级和安装软件包的漫长兔子洞 有没
  • SSR 如何与 PWA 结合

    如何使用 PWA 渐进式 Web 应用程序 进行 SSR 服务器端渲染 据我了解 SSR SSR 运行时将加载页面并运行必要的脚本以将数据加载到页面上 然后返回渲染后的html 这对于不会运行 javascript 的网络爬虫和无脚本的浏览
  • 使用字符串访问属性

    给定一个与对象字段同名的字符串 如何获取对象字段的引用 例如 假设我向 GetFieldByStr 方法传入一个名为 field1 的字符串 并且该对象具有字段名称 field1 那么如何获取对 field1 对象的引用 我假设以某种方式使
  • 使用 Ratchet\Push.js 加载页面后执行自定义脚本

    所以在 GitHub 文档上棘轮2 0 2 https github com twbs ratchet我发现了以下说法 包含 JavaScript 的脚本标签将不会在以下页面上执行 加载了push js 如果您想将事件处理程序附加到 其他页
  • 负整数除法令人惊讶的结果

    在我的应用程序中 我遇到了以下情况并对结果感到惊讶 8 7 2 均为整数 这是什么意思 对于实际值 即8 0 7 0 结果大致为 1 143 使用整数除法的结果将向下舍入到更负的值 2 这也称为 楼层划分 这就是为什么你会得到一些令人困惑的
  • 如何获取字符串中单词的所有组合

    我想获得字符串中所有相邻单词的组合 例如 细绳get all combinations我想要得到 get all combinations all combinations get all all get combinations 我写下一
  • SQL 多个 where 子句

    我找不到像这样使用多个 where 子句是否有效 我使用 JPA MySQL 我需要多个 where 子句 其中一个在这里是 not 还是我遗漏了一些东西 select d from T DEBIT d where d status PEN
  • 更改 UIView 的边界并使 UICollisionBehavior 对其做出反应

    是否可以更改 UIView 的边界 使用 UIAttachmentBehaviors 附加到其他一些 UIView 并使 UICollisionBehavior 与 UIAttachmentBehavior 相结合对其做出响应 如此处的示例
  • 在 Go 中解组通用 json [重复]

    这个问题在这里已经有答案了 我是一名新的 Go 程序员 来自 Java 我想重现一种易于在 Java 中使用的通用方法 我想创建一些函数 允许我对 JSON 字符串执行 Unmarshal 以避免代码重复 这是我当前不起作用的代码 type
  • java.sql.SQLException:连接已关闭

    我们正在得到java sql SQLException 连接已关闭 执行事务时间歇性出现异常 我们使用的是 tomcat 7 X 下面是配置
  • .Net C# RESTSharp 10 分钟超时

    我已将浏览器控件嵌入到 Net 表单中 并将其编译为窗口的可执行文件 浏览器控件正在显示我们的 HTML5 图像查看器 该应用程序打开套接字 以便它可以侦听来自各个服务器的 推送 请求 这允许将图像推送到单个用户的桌面 当传入图像推送请求时
  • 熊猫:组内最大值和最小值之间的差异

    给定一个如下所示的数据框 GROUP VALUE 1 5 2 2 1 10 2 20 1 7 我想计算每组内最大值和最小值之间的差异 也就是说 结果应该是 GROUP DIFF 1 5 2 18 在 Pandas 中执行此操作的简单方法是什
  • git 有一个损坏的丢失对象,无法修复

    git commit error inflate data stream error incorrect data check error corrupt loose object 26f0654cde5d83f2ed8d971474d9d
  • 如何在 Racer / DerbyJS 上创建服务器端应用程序逻辑?

    我正在学习新的细节DerbyJS http derbyjs com堆栈 我找不到将应用程序逻辑放在服务器端的方法 声明的意图是所有代码都应该能够在服务器和客户端中运行 但是 我需要隐藏某些数据 并且仅在根据用户会话信息进行身份验证时才将其发
  • Neo4j Spatial over REST 通过 JAVA API 不起作用(对我来说)

    我正在 Neo4J 上开发 Grails 应用程序 我还想将其导出为 GIS 数据库 查看如何在 GeoServer uDig 中使用 neo4j 的示例 似乎空间集成仅通过嵌入式 neo4j 数据库进行 有谁知道是否可以进行设置 以便我的
  • Rails 中漂亮(过时)的 RESTful URL

    我希望我的网站具有如下所示的 URL example com 2010 02 my first post 我有我的Post模型与slug字段 我的第一篇文章 和published on字段 我们将从中扣除 url 中的年份和月份部分 我想要
  • 无法从 Fargate 容器内访问 S3 存储桶(错误请求且无法找到凭据)

    我创建了一个私有 s3 存储桶和一个 Fargate 集群 其中包含一个简单的任务 该任务尝试使用以下命令从该存储桶中读取数据 python 3 and boto3 我已经在 2 个不同的 docker 镜像上尝试过了 在一个镜像上我得到了
  • 通过键盘中断关闭所有线程

    我在这里尝试做的是使用键盘中断来退出程序中所有正在进行的线程 这是我的代码的精简版本 其中创建了线程 for i in taskDictionary try sleep 60 thread Thread target mainModule