python threading.Event:添加事件参数

时间:2013-10-02 20:37:49

标签: python multithreading

我是否可以使用来自线程模块的Event对象,不仅可以通知某些事件已发生,还可以提供此事件的一些参数,例如:

e = Event()
...
e.param = "this is event data"
e.set()

另一个主题:

e.wait()
data = e.param

乍一看似乎没问题,但是有什么问题可以发生吗?安全吗?如果没有,还有什么方法可以更好地在线程之间传递一些事件参数?

感谢名单。

2 个答案:

答案 0 :(得分:4)

您实际上不需要将值附加到Event对象,您可以使用与Event分开的其他全局,属性等,并使用Event告知它已被更新。这是通常的做事方式。

但是你所做的事情确实没有错误。除了使用信号事件的常规竞争问题之外,它不会增加任何其他问题。然而,它似乎有点误导 - 它使得param看起来好像是以某种方式同步,而不是。

如果您尝试发信号通知新值已准备好,并且同步对该值的访问权限,则您几乎总是需要Condition,如下所示:

c = Condition()
data = None
...

with c:
    data = "new data"
    c.notify()

...

with c:
    while data is None:
        c.wait()

或者,更简单地说,只需使用queue并且不首先共享变量:

q = Queue()

...

q.put(data)

... 

data = q.get()

答案 1 :(得分:1)

这种方法的一个潜在问题是,如果快速设置事件,则在等待线程读取旧值之前可以覆盖该参数。

这种线程间消息传递的更标准方法是使用Queue.Queue。但是,基于队列的解决方案的限制是只有一个线程可以读取消息。换句话说:读者消费消息。这种方法非常适合生产者 - 消费者范例。 (你没有提到你是否有多个线程在等待事件)。

对于多个读者线程,您还应该考虑pubsub(发布者/订阅者)解决方案,尽管我不知道python中任何开箱即用的pubsub实现。