2024-04-18 04:37:11 发布
网友
我是否可以使用线程模块中的事件对象不仅通知发生了某个事件,还可以给出该事件的一些参数,例如:
e = Event() ... e.param = "this is event data" e.set()
另一条线索:
乍一看似乎还可以,但有什么问题超出了可能发生的范围吗?安全吗?如果没有,还有什么更好的方法可以在线程之间传递一些事件参数?在
萨克斯。在
实际上不需要将该值附加到Event对象,只需使用与Event分离的其他全局、属性等,并使用Event来表示它已更新。这是通常的做事方式。在
Event
但你所做的并没有错。而且它不会增加任何其他的问题,除了通常的比赛问题使用事件信号。然而,这似乎有点误导,它让人觉得param是以某种方式同步的,而不是同步的
param
如果您试图发出一个新值已准备就绪的信号,并同步对该值的访问,则几乎总是需要一个Condition,如下所示:
Condition
c = Condition() data = None ... with c: data = "new data" c.notify() ... with c: while data is None: c.wait()
或者,更简单地说,只需使用queue,而不首先共享一个变量:
queue
这种方法的一个潜在问题是,如果事件被快速设置,那么在等待的线程读取旧值之前,param可能会被覆盖。在
这种线程间消息传递的一种更标准的方法是使用^{}。但是,基于队列的解决方案的限制是只有一个线程可以读取消息。换言之:读者使用消息。这种方法是生产者-消费者范式的理想选择。(您没有提到是否有多个线程在等待事件)。在
对于多个读线程,您还应该考虑pubsub(publisher/subscriber)解决方案,尽管我不知道python中有任何现成的pubsub实现。在
实际上不需要将该值附加到
Event
对象,只需使用与Event
分离的其他全局、属性等,并使用Event
来表示它已更新。这是通常的做事方式。在但你所做的并没有错。而且它不会增加任何其他的问题,除了通常的比赛问题使用事件信号。然而,这似乎有点误导,它让人觉得
param
是以某种方式同步的,而不是同步的如果您试图发出一个新值已准备就绪的信号,并同步对该值的访问,则几乎总是需要一个
Condition
,如下所示:或者,更简单地说,只需使用
^{pr2}$queue
,而不首先共享一个变量:这种方法的一个潜在问题是,如果事件被快速设置,那么在等待的线程读取旧值之前,param可能会被覆盖。在
这种线程间消息传递的一种更标准的方法是使用^{} 。但是,基于队列的解决方案的限制是只有一个线程可以读取消息。换言之:读者使用消息。这种方法是生产者-消费者范式的理想选择。(您没有提到是否有多个线程在等待事件)。在
对于多个读线程,您还应该考虑pubsub(publisher/subscriber)解决方案,尽管我不知道python中有任何现成的pubsub实现。在
相关问题 更多 >
编程相关推荐