Python在线程模块中提供4 different synchronizing mechanisms:事件/条件/锁定(RLock)/信号量。
我知道它们可用于同步线程之间共享资源/关键部分的访问。但我不太确定何时使用它。
它们可以互换使用吗?或者其中一些是“更高级别”,使用其他人作为构建块?如果是的话,哪些是建立在哪个?
如果有人可以用一些例子来说明,那就太好了。
答案 0 :(得分:5)
This article可能包含您需要的所有信息。问题的确非常广泛,但让我试着解释一下我如何使用每个作为例子:
Event
- 当您需要线程来满足某个特定状态时使用它,这样它们就可以同步工作。我主要用于两个线程的启动过程,其中一个线程依赖于另一个线程。
示例:客户端有一个线程管理器,其__init__()
需要知道管理器在继续运行之前已经完成了一些属性的实例化。
Lock/RLock
- 在使用共享资源时使用它,并且您希望确保没有其他线程正在读取/写入它。虽然我认为虽然在写之前锁定是强制性的,但在阅读之前锁定可能是可选的。但是,确保在读/写时没有其他线程同时修改它是很好的。 RLock
具有被其所有者多次获取的能力,并且release()
必须被调用acquire()
相同的次数才能被另一个尝试获取的线程使用它
我还没有使用Condition
那么多,坦率地说从来没有使用Semaphore
,所以这个答案有编辑和改进的空间。