何时在python的线程模块中使用事件/条件/锁/信号量?

Neo*_*ang 4 python multithreading synchronization locking

Python 在线程模块中提供了4种不同的同步机制:Event / Condition / Lock(RLock)/ Semaphore。

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

它们可以互换使用吗?还是其中一些是“较高级别”,将其他作为构建基块?如果是这样,那么哪个是基于哪个?

如果有人可以举例说明,那就太好了。

sar*_*gas 5

本文可能包含您需要的所有信息。这个问题确实非常广泛,但是让我尝试解释如何使用每个示例:

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

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

  2. Lock/RLock-当您使用共享资源并且要确保没有其他线程正在读/写该资源时,请使用它。尽管我认为写前锁定是强制性的,但读前锁定可能是可选的。但是最好确保在读/写时没有其他线程同时修改它。RLock具有被其所有者多次获取的能力,并且release()必须被调用相同的时间acquire(),以便其他尝试获取它的线程使用它。

Condition没用太多,坦白说从来不用Semaphore,所以这个答案有编辑和改进的余地。