何时在 python 的线程模块中使用 event/condition/lock/semaphore?

When to use event/condition/lock/semaphore in python's threading module?

Python在线程模块中提供了4 different synchronizing mechanisms:Event/Condition/Lock(RLock)/Semaphore。

我知道它们可用于同步线程间共享 resources/critical 部分的访问。但是我不太确定什么时候使用哪个。

它们可以互换使用吗?或者他们中的一些人 'higher level' 正在使用其他人作为积木?如果有,哪些是建立在哪些基础上的?

如果有人能举例说明就太好了。

This article 可能包含您需要的所有信息。这个问题确实很广泛,但让我试着解释一下我是如何使用每个例子的:

  1. Event - 当您需要线程进行通信时使用它满足特定状态,以便它们可以一起同步工作。我主要将它用于两个线程的启动过程,其中一个依赖于另一个。

    示例:一个客户端有一个线程管理器,它__init__()需要知道管理器完成了一些属性的实例化,然后才能继续。

  2. Lock/RLock - 当您使用共享资源并希望确保没有其他线程reading/writing 使用它时使用它。虽然我认为虽然在写入 之前锁定 是强制性的,但在读取 之前锁定 可能是可选的。但最好确保当您处于 reading/writing 时,没有其他线程同时修改它。 RLock 能够被其所有者多次获取,并且 release() 必须被调用相同的次数 acquire() 才能被另一个试图获取的线程使用它.

我没怎么用过Condition,坦率地说从来不用Semaphore,所以这个答案还有编辑和改进的余地。