Python将threading.Event作为类成员时实例共享事件的问题求助
问题根源与解决方案
你遇到的这个问题核心原因很明确:你把trigger_event定义成了类属性,而不是实例属性。
在Python中,类属性是绑定在类本身的,所有该类的实例都会共享同一个类属性对象。也就是说,不管你创建多少个Example实例,它们的trigger_event指向的都是同一个threading.Event对象。所以当第一个实例调用set_trigger()触发了set()操作后,这个共享的Event就被置为已触发状态,其他所有实例访问的都是这个已经被设置的Event,自然is_set()都会返回True。
修复方案:使用实例属性
要让每个Example对象拥有独立的Event,只需要把trigger_event的初始化移到类的__init__方法中,将它定义为实例属性即可:
import threading class Example(object): def __init__(self): # 每个实例初始化时创建自己独有的Event对象 self.trigger_event = threading.Event() def set_trigger(self): # do some stuff self.trigger_event.set()
验证效果
现在你可以测试一下:创建10个实例,只调用第一个实例的set_trigger(),然后打印每个实例的is_set()结果,会发现只有第一个实例返回True,其余都是False,完美实现了每个对象拥有独立的Event状态。
总结一下:类属性适合存放所有实例共享的数据/对象,而实例属性才是每个实例独有的状态载体,这里的场景显然需要后者。
内容的提问来源于stack exchange,提问作者chaylins
相关产品推荐
相关产品推荐

