Python中线程之间的通信(不使用全局变量)

2023-12-30

假设我们有一个主线程,它为测试模块启动两个线程 - “test_a”和“test_b”。 无论测试模块执行完毕还是遇到任何错误、警告或者想要更新某些其他信息,两个测试模块线程都会保持其状态。

主线程如何访问这些信息并采取相应的行动。 例如,如果“test_a”引发错误标志;在出现错误之前,“主要”如何知道并停止其余测试?

一种方法是使用全局变量,但这会变得非常难看......很快。


显而易见的解决方案是通过在构造函数/启动时将其传递给线程对象/函数来共享某种可变变量。

执行此操作的简洁方法是构建一个具有适当实例属性的类。如果您使用的是threading.Thread subclass https://docs.python.org/2/library/threading.html#thread-objects,您通常可以使用子类本身作为粘贴这些属性的地方,而不仅仅是一个线程函数。但我会用一个来展示它list只是因为它更短:

def test_a_func(thread_state):
    # ...
    thread_state[0] = my_error_state
    # ...

def main_thread():
    test_states = [None]
    test_a = threading.Thread(target=test_a_func, args=(test_states,))
    test_a.start()

您还可以(并且通常想要)打包Lock or Condition进入可变状态对象,这样你就可以在之间正确同步main_thread and test_a.

(另一种选择是使用queue.Queue, an os.pipe等来传递信息,但您仍然需要将该队列或管道传递给子线程 - 您的操作方式与上面完全相同。)


但是,值得考虑您是否真的需要这样做。如果你想到test_a and test_b作为“作业”,而不是“线程函数”,您可以在池上执行这些作业,并让池处理返回的结果或错误。

例如:

try:
    with concurrent.futures.ThreadPoolExecutor(workers=2) as executor:
        tests = [executor.submit(job) for job in (test_a, test_b)]
        for test in concurrent.futures.as_completed(tests):
            result = test.result()
except Exception as e:
    # do stuff

现在,如果test_a函数引发异常,主线程将得到该异常——并且,因为这意味着退出with阻塞,所有其他作业都被取消并丢弃,并且工作线程关闭。

如果您使用的是 2.5-3.1,则没有concurrent.futures内置,但您可以安装PyPI 的向后移植 https://pypi.python.org/pypi/futures,或者你可以重写一些东西multiprocessing.dummy.Pool. (It's slightly这样会更复杂,因为您必须创建一系列作业并调用map_async返回一个迭代器AsyncResult对象……但实际上这仍然很简单。)

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

Python中线程之间的通信(不使用全局变量) 的相关文章

  • 与区域指示符字符类匹配的 python 正则表达式

    我在 Mac 上使用 python 2 7 10 表情符号中的标志由一对表示区域指示符号 https en wikipedia org wiki Regional Indicator Symbol 我想编写一个 python 正则表达式来在
  • Python 中的舍入浮点问题

    我遇到了 np round np around 的问题 它没有正确舍入 我无法包含代码 因为当我手动设置值 而不是使用我的数据 时 返回有效 但这是输出 In 177 a Out 177 0 0099999998 In 178 np rou
  • 用枢轴点拟合曲线 Python

    我有下面的图 我想用 2 条线来拟合它 使用 python 我设法适应上半部分 def func x a b x np array x return a x b popt pcov curve fit func up x up y 我想用另
  • Pandas 日期时间格式

    是否可以用零后缀表示 pd to datetime 似乎零被删除了 print pd to datetime 2000 07 26 14 21 00 00000 format Y m d H M S f 结果是 2000 07 26 14
  • Python zmq SUB 套接字未接收 MQL5 Zmq PUB 套接字

    我正在尝试在 MQL5 中设置一个 PUB 套接字 并在 Python 中设置一个 SUB 套接字来接收消息 我在 MQL5 中有这个 include
  • 将 python2.7 与 Emacs 24.3 和 python-mode.el 一起使用

    我是 Emacs 新手 我正在尝试设置我的 python 环境 到目前为止 我已经了解到在 python 缓冲区中使用 python mode el C c C c将当前缓冲区的内容加载到交互式 python shell 中 显然使用了什么
  • YOLOv8获取预测边界框

    我想将 OpenCV 与 YOLOv8 集成ultralytics 所以我想从模型预测中获取边界框坐标 我该怎么做呢 from ultralytics import YOLO import cv2 model YOLO yolov8n pt
  • 使用 xlrd 打开 BytesIO (xlsx)

    我正在使用 Django 需要读取上传的 xlsx 文件的工作表和单元格 使用 xlrd 应该可以 但因为文件必须保留在内存中并且可能不会保存到我不知道如何继续的位置 本例中的起点是一个带有上传输入和提交按钮的网页 提交后 文件被捕获req
  • Python 2:SMTPServerDisconnected:连接意外关闭

    我在用 Python 发送电子邮件时遇到一个小问题 me my email address you recipient s email address me email protected cdn cgi l email protectio
  • Python,将函数的输出重定向到文件中

    我正在尝试将函数的输出存储到Python中的文件中 我想做的是这样的 def test print This is a Test file open Log a file write test file close 但是当我这样做时 我收到
  • 如何使用python在一个文件中写入多行

    如果我知道要写多少行 我就知道如何将多行写入一个文件 但是 当我想写多行时 问题就出现了 但是 我不知道它们会是多少 我正在开发一个应用程序 它从网站上抓取并将结果的链接存储在文本文件中 但是 我们不知道它会回复多少行 我的代码现在如下 r
  • Docker 中的 Python 日志记录

    我正在 Ubuntu Web 服务器上的 Docker 容器中测试运行 python 脚本 我正在尝试查找由 Python Logger 模块生成的日志文件 下面是我的Python脚本 import time import logging
  • pyspark 将 twitter json 流式传输到 DF

    我正在从事集成工作spark streaming with twitter using pythonAPI 我看到的大多数示例或代码片段和博客是他们从Twitter JSON文件进行最终处理 但根据我的用例 我需要所有字段twitter J
  • pip 列出活动 virtualenv 中的全局包

    将 pip 从 1 4 x 升级到 1 5 后pip freeze输出我的全局安装 系统 软件包的列表 而不是我的 virtualenv 中安装的软件包的列表 我尝试再次降级到 1 4 但这并不能解决我的问题 这有点类似于这个问题 http
  • 仅第一个加载的 Django 站点有效

    我最近向 stackoverflow 提交了一个问题 标题为使用mod wsgi在apache上多次请求后Django无限加载 https stackoverflow com questions 71705909 django infini
  • 如何在 pygtk 中创建新信号

    我创建了一个 python 对象 但我想在它上面发送信号 我让它继承自 gobject GObject 但似乎没有任何方法可以在我的对象上创建新信号 您还可以在类定义中定义信号 class MyGObjectClass gobject GO
  • 如何解决 PDFBox 没有 unicode 映射错误?

    我有一个现有的 PDF 文件 我想使用 python 脚本将其转换为 Excel 文件 目前正在使用PDFBox 但是存在多个类似以下错误 org apache pdfbox pdmodel font PDType0Font toUnico
  • python import inside函数隐藏现有变量

    我在我正在处理的多子模块项目中遇到了一个奇怪的 UnboundLocalError 分配之前引用的局部变量 问题 并将其精简为这个片段 使用标准库中的日志记录模块 import logging def foo logging info fo
  • 模拟pytest中的异常终止

    我的多线程应用程序遇到了一个错误 主线程的任何异常终止 例如 未捕获的异常或某些信号 都会导致其他线程之一死锁 并阻止进程干净退出 我解决了这个问题 但我想添加一个测试来防止回归 但是 我不知道如何在 pytest 中模拟异常终止 如果我只
  • 使用随机放置的 NaN 创建示例 numpy 数组

    出于测试目的 我想创建一个M by Nnumpy 数组与c随机放置的 NaN import numpy as np M 10 N 5 c 15 A np random randn M N A mask np nan 我在创建时遇到问题mas

随机推荐

  • 公证节点查询数据和普通节点查询交易

    我有一个关于查询数据的问题 Corda中有没有办法查询公证节点存储的所有数据以及如何查询其他节点中的交易 在 Corda 中 每个节点都有自己的数据库支持 该数据库仅存储节点知道的交易 出于隐私原因 节点无法查询其他节点的数据库 相反 您必
  • Wordpress 上出现错误“您无权将文件附加到此帖子”

    When non admin users upload media They get the following error 我检查过的事情 wp content uploads 及其所有子文件夹的权限为 755 Core capabili
  • 模板类的不同专业化的向量

    由于我一直在 C 中使用模板 所以经常遇到这个问题 我想在向量中收集模板类的不同版本的实例 我知道这不可能直接实现 但我想知道是否有一些解决方法可以实现这一点 例如 如果我有这样的模板化类 enum test e TYPE A TYPE B
  • 为什么无法连接到 Windows 10 上的本地 docker-compose 容器?

    我正在尝试对一个 Python 应用程序进行 dockerize 我一直在关注该应用程序本教程 https realpython com blog python dockerizing flask with compose and mach
  • 当安装位于关联的子目录中时,如何从 Drupal 7 中的 URL 中删除 /drupal

    在 Drupal 6 中 我能够在名为 drupal 的子目录中成功安装 Drupal 然后引用该站点 而无需使用 example com drupal 在 Drupal 6 中 为了使其正常工作 我执行了以下操作 在创建 drupal 的
  • Bootsfaces 页面显示在浏览器中,没有任何样式

    我在 Tomcat 上运行的 eclipse 中创建了一个简单的 JSF 项目 我尝试将 Bootsfaces jar 包含在 WEB INF lib 中 并将标签包含在我的 xhtml 页面中 如 Bootsfaces 入门页面所示 但这
  • 如何在 TinyMCE v4 中实现tinymce.Shortcuts

    我想向我的 TinyMCE 编辑器添加键盘快捷键 这是我的初始化代码 tinymce init selector textarea menubar false mode exact plugins advlist autolink list
  • 如何:Spring 摆脱 @Validate 以进行自动控制器验证?

    我知道关于 Valid注释指示 spring 根据 JSR 303 验证控制器参数 如下例所示 GetMapping test public TestDTO testDTO Valid TestDTO testDTO return test
  • 从 XPath 字符串中删除或替换某些文本

    是否可以删除或替换 XPath 字符串上的文本 使用 XPath 我得到 urlhttp www http www我想删除http www http www 所以相同的 XPath 查询只会返回一个链接 而不返回http www http
  • 单个语句中的多个 mongodb 更新运算符?

    我可以将 pushAll 和 inc 合并在一个语句中吗 在合并之前 这工作正常 db createCollection test db test insert name albert bugs db test update name al
  • Firefox 在使用溢出时忽略填充:滚动

    使用时overflow scroll结合padding CSS 属性 Firefox 中缺少元素底部的填充 但适用于 Chrome 和 Safari container height 100px padding 50px border so
  • 如何查找 MongoDB Collection 中特定文档的大小?

    我在 MongoDB 集合中有 100k 个文档 document id 789736363828292 有 20k 文档 记录 我想找到该特定文档使用的内存 请帮我在 MongoDB 控制台中找到内存大小 以 MB 为单位 您可以使用Ob
  • 如何在标题中获取黄瓜场景变量?

    我希望能够通过使用标题本身中的示例让我的场景大纲标题包含更多信息 Scenario Outline A
  • 如何使面板居中?

    即使表单的大小发生变化 如何使面板居于表单中心 使用 C Windows 应用程序 使用设计器将面板放置在窗体的中心 然后清除Anchor属性 因此它不锚定到任何边缘 这将在调整表单大小时使其保持居中 而无需调整面板本身的大小 如果由于某种
  • 图搜索和树搜索有什么区别?

    有什么区别图搜索 and 树搜索有关 DFS A 搜索的版本人工智能 从现有的答案来看 这个概念似乎存在很多混乱 问题始终是图表 树搜索和图搜索之间的区别并不在于问题图是树还是一般图 始终假设您正在处理一般图表 区别在于遍历模式用于搜索图形
  • Google 地图 API v3 - 灰显或删除状态?

    是否可以将我不想从地图上看到的状态灰显 甚至更好地一起删除 搜索时无法找到任何明确的答案 我试图仅显示德克萨斯州地图并在其上放置标记 Thanks 你在寻找类似的东西吗这个 v2 示例 http maps forum nu gm texas
  • MSChart:饼图标签重叠问题

    我用过MSChart Control在我的一个VB NET项目 我决定将如下表所示的数据显示为饼图 但标签相互重叠 为了摆脱它 我已经尝试过 智能标签 属性如下图所示 Chart1 Series Default SmartLabelStyl
  • 如何防止标签栏控制器中的视图控制器旋转?

    我有一个管理 4 个选项卡的选项卡栏控制器 我对选项卡栏控制器进行了子类化 以便 shouldAutorotateToInterfaceOrientation 方法仅允许选项卡之一中的特定视图控制器旋转 一切工作几乎正常 其余选项卡中的控制
  • Oracle 数据库:DBMS_ALERT 在 Java 应用程序中的使用

    我有一个 java 应用程序服务器 使用 JDBC 与 oracle 11 2 数据库服务器进行通信 客户端的请求被发送到应用程序服务器 该应用程序服务器运行调用数据库中的第一个存储过程的java方法 我希望 java 方法在调用存储过程后
  • Python中线程之间的通信(不使用全局变量)

    假设我们有一个主线程 它为测试模块启动两个线程 test a 和 test b 无论测试模块执行完毕还是遇到任何错误 警告或者想要更新某些其他信息 两个测试模块线程都会保持其状态 主线程如何访问这些信息并采取相应的行动 例如 如果 test