python线程。事件:添加事件参数

2024-04-18 04:37:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我是否可以使用线程模块中的事件对象不仅通知发生了某个事件,还可以给出该事件的一些参数,例如:

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

另一条线索:

^{pr2}$

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

萨克斯。在


Tags: 模块对象方法eventdata参数paramis
2条回答

实际上不需要将该值附加到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,而不首先共享一个变量:

^{pr2}$

这种方法的一个潜在问题是,如果事件被快速设置,那么在等待的线程读取旧值之前,param可能会被覆盖。在

这种线程间消息传递的一种更标准的方法是使用^{}。但是,基于队列的解决方案的限制是只有一个线程可以读取消息。换言之:读者使用消息。这种方法是生产者-消费者范式的理想选择。(您没有提到是否有多个线程在等待事件)。在

对于多个读线程,您还应该考虑pubsub(publisher/subscriber)解决方案,尽管我不知道python中有任何现成的pubsub实现。在

相关问题 更多 >