【问题标题】:Python using thread event as an object memberPython使用线程事件作为对象成员
【发布时间】:2020-03-30 15:44:37
【问题描述】:

我有一个类,例如像下面这样

Class Example(object):
   trigger_event = threading.Event()

    def set_trigger(self):
        # do some stuff
        self.trigger_event.set()

我发现如果我有一组这些对象并在一个线程中处理它们,那么一旦第一个对象设置了它的事件,那么所有其他对象也设置了它。有没有办法为每个单独的对象拥有一个唯一的 Event 成员?

如果我有 10 个对象,并在调用 set_trigger() 之前打印出事件的 is_set(),那么它将显示为 FALSE、TRUE、TRUE、TRUE 等...

提前感谢您的任何帮助或见解!

【问题讨论】:

    标签: python multithreading events


    【解决方案1】:

    您可能误解了Event 对象。 Event 对象用于多个线程之间的通信:一个线程发出事件信号,其他线程等待它。

    一个事件对象管理一个内部标志,该标志可以设置为真 set() 方法并使用 clear() 方法重置为 false。这 wait() 方法阻塞,直到标志为真。

    但如果你仍然想这样做,你必须在每次创建 Example 的新实例时创建新的事件对象。所以你可能需要做类似的事情,

    class Example(object):
        def __init__(self):
            self.trigger_event = threading.Event()
    
        def set_trigger(self):
            # do some stuff
            self.trigger_event.set()
    
    e1 = Example()
    print(e1.trigger_event.is_set())
    e1.set_trigger()
    print(e1.trigger_event.is_set())
    
    e2 = Example()
    print(e2.trigger_event.is_set())
    e2.set_trigger()
    e2.trigger_event.wait()
    print(e2.trigger_event.is_set())
    

    输出:

    False
    True
    False
    True
    

    【讨论】:

    • 谢谢,你是对的 - 你的方法适用于我的实例。在我的实际示例中,我有两个线程 - 一个解析器和一个 DB 线程,我需要一种方法让解析器知道 DB 何时处理其请求,因此使用事件和您的建议使其工作!再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多