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

时间:2015-07-27 03:47:40

标签: python multithreading synchronization locking

Python在线程模块中提供4 different synchronizing mechanisms:事件/条件/锁定(RLock)/信号量。

我知道它们可用于同步线程之间共享资源/关键部分的访问。但我不太确定何时使用它。

它们可以互换使用吗?或者其中一些是“更高级别”,使用其他人作为构建块?如果是的话,哪些是建立在哪个?

如果有人可以用一些例子来说明,那就太好了。

1 个答案:

答案 0 :(得分:5)

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

  1. Event - 当您需要线程来满足某个特定状态时使用它,这样它们就可以同步工作。我主要用于两个线程的启动过程,其中一个线程依赖于另一个线程。

    示例:客户端有一个线程管理器,其__init__()需要知道管理器在继续运行之前已经完成了一些属性的实例化。

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

  3. 我还没有使用Condition那么多,坦率地说从来没有使用Semaphore,所以这个答案有编辑和改进的空间。