54

我还没有找到对模块中ConditionEvent类之间差异的清晰解释。threading是否有一个明确的用例,其中一个比另一个更有帮助?我能找到的所有示例都使用生产者-消费者模型作为示例,哪里queue.Queue是更直接的解决方案。

4

2 回答 2

79

简而言之,当线程有兴趣等待某事变为真时,您使用条件,一旦变为真,就可以独占访问某些共享资源。

而当线程只是对等待某事变为真的感兴趣时,您会使用事件。

本质上,Condition 是一个抽象的 Event + Lock,但是当您考虑到您可以在同一个底层锁上拥有多个不同的条件时,它会变得更加有趣。因此,您可以有不同的条件来描述底层资源的状态,这意味着您可以唤醒只对共享资源的特定状态感兴趣的工作人员。

于 2011-09-15T01:11:39.463 回答
10

另一个细微的区别是Event'sset()影响未来的调用wait()(即,后续调用wait()将返回True并且不会阻塞,直到clear()被调用),而Condition's notify()(或notify_all())不会(后续调用wait()将阻塞,直到下一次调用notify()) .

于 2018-09-30T13:41:24.287 回答