我是否可以使用来自线程模块的Event对象,不仅可以通知某些事件已发生,还可以提供此事件的一些参数,例如:
e = Event()
...
e.param = "this is event data"
e.set()
另一个主题:
e.wait()
data = e.param
乍一看似乎没问题,但是有什么问题可以发生吗?安全吗?如果没有,还有什么方法可以更好地在线程之间传递一些事件参数?
感谢名单。
答案 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实现。