Python threading.Event() - 确保所有等待线程在 event.set() 上唤醒

2024-01-10

我有许多线程等待事件,执行某些操作,然后再次等待事件。另一个线程将在适当的时候触发该事件。

我无法找到一种方法来确保每个等待线程在设置事件时恰好触发一次。我目前已将触发线程设置为休眠一段时间,然后清除它。不幸的是,这会导致等待线程多次抓取设置的事件,或者根本不抓取。

我不能简单地让触发线程生成响应线程来运行它们一次,因为它们是对从其他地方发出的请求的响应。

简而言之:在Python中,如何让线程设置事件并确保每个等待线程在事件被清除之前对事件执行一次操作?

Update:

我尝试过使用锁和队列来设置它,但它不起作用。这是我所拥有的:

# Globals - used to synch threads
waitingOnEvent = Queue.Queue
MainEvent = threading.Event()
MainEvent.clear()    # Not sure this is necessary, but figured I'd be safe
mainLock = threading.Lock()

def waitCall():
    mainLock.acquire()
    waitingOnEvent.put("waiting")
    mainLock.release()
    MainEvent.wait()
    waitingOnEvent.get(False)
    waitingOnEvent.task_done()
    #do stuff
    return

def triggerCall():
    mainLock.acquire()
    itemsinq = waitingOnEvent.qsize()
    MainEvent.set()
    waitingOnEvent.join()
    MainEvent.clear()
    mainLock.release()
    return

第一次,itemsinq 正确地反映了有多少调用正在等待,但只有第一个等待调用的线程才能通过。从此,itemsinq始终为1,等待线程轮流;每次触发调用发生时,都会执行下一个调用。

Update 2看起来好像只有一个 event.wait() 线程正在唤醒,但queue.join() 正在工作。这对我来说意味着一个等待线程醒来,从队列中抓取并调用task_done(),并且单个get()/task_done()以某种方式清空队列并允许join()。然后,触发线程完成 join(),清除事件,从而阻止其他等待线程通过。为什么队列只在一次 get/task_done 调用后就注册为空/已完成?

即使我注释掉queue.get()和queue.task_done()并挂起触发器,这样它就无法清除事件,似乎只有一个正在醒来。


您不需要事件,也不需要锁和队列。您所需要的只是一个队列。

Call queue.put将消息放入而不等待消息被传递或处理。

Call queue.get在工作线程中等待消息到达。

import threading
import Queue

active_queues = []

class Worker(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.mailbox = Queue.Queue()
        active_queues.append(self.mailbox)

    def run(self):
        while True:
            data = self.mailbox.get()
            if data == 'shutdown':
                print self, 'shutting down'
                return
            print self, 'received a message:', data

    def stop(self):
        active_queues.remove(self.mailbox)
        self.mailbox.put("shutdown")
        self.join()


def broadcast_event(data):
    for q in active_queues:
        q.put(data)

t1 = Worker()
t2 = Worker()
t1.start()
t2.start()
broadcast_event("first event")
broadcast_event("second event")
broadcast_event("shutdown")

t1.stop()
t2.stop()

消息不必是字符串;它们可以是任何 Python 对象。

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

Python threading.Event() - 确保所有等待线程在 event.set() 上唤醒 的相关文章

  • 将 Matplotlib 误差线放置在不位于条形中心的位置

    我正在 Matplotlib 中生成带有错误栏的堆积条形图 不幸的是 某些层相对较小且数据多样 因此多个层的错误条可能重叠 从而使它们难以或无法读取 Example 有没有办法设置每个误差条的位置 即沿 x 轴移动它 以便重叠的线显示在彼此
  • 如何在flask中使用g.user全局

    据我了解 Flask 中的 g 变量 它应该为我提供一个全局位置来存储数据 例如登录后保存当前用户 它是否正确 我希望我的导航在登录后在整个网站上显示我的用户名 我的观点包含 from Flask import g among other
  • 从字符串中删除识别的日期

    作为输入 我有几个包含不同格式日期的字符串 例如 彼得在16 45 我的生日是1990年7月8日 On 7 月 11 日星期六我会回家 I use dateutil parser parse识别字符串中的日期 在下一步中 我想从字符串中删除
  • 如何替换 pandas 数据框列中的重音符号

    我有一个数据框dataSwiss其中包含瑞士城市的信息 我想用普通字母替换带有重音符号的字母 这就是我正在做的 dataSwiss Municipality dataSwiss Municipality str encode utf 8 d
  • SQLALchemy .query:类“Car”的未解析属性引用“query”

    我有一个这里已经提到的问题https youtrack jetbrains com issue PY 44557 https youtrack jetbrains com issue PY 44557 但我还没有找到解决方案 我使用 Pyt
  • Final字段的线程安全

    假设我有一个 JavaBeanUser这是从另一个线程更新的 如下所示 public class A private final User user public A User user this user user public void
  • Python 函数可以从作用域之外赋予新属性吗?

    我不知道你可以这样做 def tom print tom s locals locals def dick z print z name z name z guest Harry print z guest z guest print di
  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • 临时表是线程安全的吗?

    我正在使用 SQL Server 2000 它的许多存储过程广泛使用临时表 数据库的流量很大 我担心创建和删除临时表的线程安全性 假设我有一个存储过程 它创建了一些临时表 它甚至可以将临时表连接到其他临时表等 并且还可以说两个用户同时执行存
  • asp.net core / kestrel中的线程管理

    我正在解决我们已迁移到 asp net core 2 0 的 asp net 应用程序的性能 可扩展性问题 我们的应用程序作为应用程序服务托管在 azure 上 并且在任何中等流量的情况下都很容易崩溃 让我困惑的一件事是如何处理多个并发请求
  • Python 的“zip”内置函数的 Ruby 等价物是什么?

    Ruby 是否有与 Python 内置函数等效的东西zip功能 如果不是 做同样事情的简洁方法是什么 一些背景信息 当我试图找到一种干净的方法来进行涉及两个数组的检查时 出现了这个问题 如果我有zip 我可以写这样的东西 zip a b a
  • 在Python中获取文件描述符的位置

    比如说 我有一个原始数字文件描述符 我需要根据它获取文件中的当前位置 import os psutil some code that works with file lp lib open path to file p psutil Pro
  • 如何使用Python创建历史时间线

    So I ve seen a few answers on here that helped a bit but my dataset is larger than the ones that have been answered prev
  • IO 密集型任务中的 Python 多线程

    建议仅在 IO 密集型任务中使用 Python 多线程 因为 Python 有一个全局解释器锁 GIL 只允许一个线程持有 Python 解释器的控制权 然而 多线程对于 IO 密集型操作有意义吗 https stackoverflow c
  • 将图像分割成多个网格

    我使用下面的代码将图像分割成网格的 20 个相等的部分 import cv2 im cv2 imread apple jpg im cv2 resize im 1000 500 imgwidth im shape 0 imgheight i
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • Conda SafetyError:文件大小不正确

    使用创建 Conda 环境时conda create n env name python 3 6 我收到以下警告 Preparing transaction done Verifying transaction SafetyError Th
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 如何计算 pandas 数据帧上的连续有序值

    我试图从给定的数据帧中获取连续 0 值的最大计数 其中包含来自 pandas 数据帧的 id date value 列 如下所示 id date value 354 2019 03 01 0 354 2019 03 02 0 354 201
  • Python 类继承 - 诡异的动作

    我观察到类继承有一个奇怪的效果 对于我正在处理的项目 我正在创建一个类来充当另一个模块的类的包装器 我正在使用第 3 方 aeidon 模块 用于操作字幕文件 但问题可能不太具体 以下是您通常如何使用该模块 project aeidon P

随机推荐

  • 创建原始数据包来欺骗 UDP 数据包

    我正在寻找使用 Java 欺骗 UDP 数据包 有没有好的 Java 库可以让您创建自己的原始套接字 我会使用一个 Java API 来包装libpcap http www tcpdump org libpcap 有一个 注入 功能 允许您
  • 如何不在nginx访问日志中记录get请求参数?

    我需要启用访问日志 但出于合规性原因 无法在访问日志中记录敏感 GET 请求参数的数据 虽然我知道 我可以解析日志 事后 并清理它们 但这不是一个可接受的解决方案 因为出于合规性原因 日志不能被篡改 如何防止 sensitive data
  • 正则表达式匹配除某些之外的所有集合

    我确定以前曾问过这个问题 但我似乎找不到它 或知道要搜索的正确措辞 基本上我想要一个匹配除连字符之外的所有非字母数字的正则表达式 所以基本上匹配 W 除了排除 我不知道如何从预制集中排除特定的 W是一个简写 w So w 一些背景知识 定义
  • 识别批处理文件的运行实例

    这些对我不起作用 有什么帮助可以明确纠正以下四个示例吗 即使我打开了三个 CMD exe EXAMPLE01 也只是回显 继续 示例 01 echo off wmic process where name cmd exe find cmd
  • 依赖于自身的 Spark 窗口函数

    假设我在 DataFrame 中有一列已排序的时间戳 我想编写一个函数 向该 DataFrame 添加一列 根据以下规则将时间戳切割成连续的时间片 从第一行开始并继续迭代到最后 对于每一行 如果您在当前组中走了 n 行 或者您在当前组中走了
  • 获取从星期日开始的周数

    我目前有这样的代码 我可以通过添加和减去按钮获取周数以及该周的开始 结束日 Date prototype getWeekNumber function var d new Date Date UTC this getFullYear thi
  • Razor:条件语句中的 标记引发错误

    if Model Property null
  • Jenkins“仅在构建成功时才运行”对于不成功的构建仍然运行

    我正在使用 Jenkins 进行持续集成 并且我有一些具有上游和下游构建连接的项目 我已选择Run only if build succeeds在每个项目的配置中 然而 构建后步骤仍然会因不稳定的构建而被触发 詹金斯版本是 1 480 3
  • 使用循环数组实现队列:调整循环数组大小的最佳方法是什么?

    我正在实施一个使用循环数组进行队列 我有点陷入困境resize 方法实现 当数组已满时 在 的里面enqueue 方法我检查数组的大小是否等于它的长度 并获取它是否已满 现在 我不再抛出异常 而是尝试调整数组的大小 问题是 我有两种情况要考
  • postgresql 中 array_agg 的子选择

    有没有办法在 Postgresql 9 2 的having子句中使用聚合函数的值 例如 我想得到每个monkey id第二高的number gt 123 也是第二高的数字 在下面的示例中 我想获取 monkey id 1 number 22
  • 使用 AddDistributedRedisCache 时设置 IDistributedCache.SetAsync 的过期时间

    我正在使用 net core api 2 1 和 aws redis 缓存 我没有找到设置过期时间的方法IDistributedCache SetAsync https learn microsoft com en us dotnet ap
  • 在 iOS 中使用相机检测物体并使用 ARKit 定位 3D 物体

    我在寻找什么 我的要求的简单解释是这样的 使用 ARKit 使用 iPhone 相机检测对象 找到这个物体在这个虚拟空间上的位置 使用 SceneKit 将 3D 对象放置在该虚拟空间上 3D 对象应该位于 标记 一个示例是使用相机检测 3
  • 方向改变时出现的键盘问题

    在我的应用程序中 我使用各种编辑文本和文本视图以及列表视图 现在我的问题是我的键盘在方向改变时再次出现 理想情况下 当用户最小化键盘时 设备倾斜时键盘应处于最小化状态 但它又出现了 我们如何处理这种情况 我的另一个问题是我的编辑文本之一是屏
  • Express js 应用程序与 nginx - 提供子文件夹时与静态文件发生冲突

    upstream app server localhost 3000 server If I comment this location out images are displayed on the website location jp
  • 从调用范围中提取变量的字符串格式化程序是不好的做法吗?

    我有一些代码可以进行大量的字符串格式化 通常 我最终会得到如下代码 format x x y y z z foo foo 我试图将大量变量插入一个大字符串中 是否有充分的理由不编写这样一个使用inspect模块查找要插值的变量 import
  • Unix 中的作业和进程有什么区别?

    和有什么区别job and a process在Unix 中 你能举个例子吗 作业是由 shell 启动的进程 shell 在作业表中跟踪这些内容 这jobs命令显示活动后台进程的列表 他们获得的作业规范编号不是进程的 PID 命令如fg使
  • 根据 R 中的日期通过线性插值进行数据插补

    我有一个来自不同地块的矿物氮值的大型数据集 其中包括一些我们无法采样的日期缺失的数据 众所周知 土壤中的矿物质氮值会发生变化linearly采样之间 为了简化起见 我创建了一个数据框 其中有 10 个图 其中有 4 个日期 它们之间的距离不
  • 如何合并/更新 boost::property_tree::ptree?

    我已经阅读了 boost property tree 的文档 但没有找到更新或合并 ptree 与另一个 ptree 的方法 我该怎么做呢 给出下面的代码 update ptree 函数会是什么样子 include
  • JFrame:获取无边框大小?

    在Java中 是否可以获取没有标题和其他边框的JFrame的宽度和高度 frame getWidth 和frame getHeight 1 似乎返回包括边框的宽度 Thanks frame getContentPane getSize
  • Python threading.Event() - 确保所有等待线程在 event.set() 上唤醒

    我有许多线程等待事件 执行某些操作 然后再次等待事件 另一个线程将在适当的时候触发该事件 我无法找到一种方法来确保每个等待线程在设置事件时恰好触发一次 我目前已将触发线程设置为休眠一段时间 然后清除它 不幸的是 这会导致等待线程多次抓取设置