Threading Module源码概述(二)

时间:2021-03-06 03:28:24

  在threading 模块中,提供了列举当前所有子线程的操作。threading.enumerate。这个操作很简单,就是将_active和_limbo中维护的线程集合的信息输出。

 def enumerate():

     with _active_limbo_lock:
return _active.values() + _limbo.values()

Threading线程同步工具

  在thread模块中,Python提供了用户级别的线程同步工具:Lock对象。而在threading模块中,Python提供了不同的用于线程同步的工具。以简化用户实现多线程的应用程序。这些threading中的线程同步工具实际上都是建立在thread所提供的Lock对象的基础上的。

  在threading中,我们可以在直接创建thread中的Lock对象,threading没有做任何的包装,仅仅是简单的将其展示出来。

 _allocate_lock = thread.allocate_lock
Lock = _allocate_lock

  通过调用threading.Lock,我们就可以创建一个thread中的Lock对象。如前面所描述的,在这个对象上,我们可以进行acquire和release等操作。在threading中的其他线程同步工具都是在这个Lock对象的基础上,下面我们将对这些线程同步工具做一个概述性的介绍。

RLock

  RLock对象是Lock对象的一个变种,其内部维护着一个Lock对象,但是它是一种可重入的Lock。一般地,对于Lock对象而言,如果一个线程连续两次进行acquire操作,那么由于第一次acquire之后没有release,第二次acquire将挂起线程,这将直接导致Lock对象永远不会release,因此线程死锁。RLock对象允许一个线程多次对其进行acquire操作,因为在其内部通过一个counter变量维护着线程acquire的次数。而且每一次的acquire操作必须有一个release操作与之对应。在所有的release操作都完成之后,别的线程才能申请该RLock对象。

Condition

  Condition对象是对Lock对象的包装,在创建Condition对象时,其构造函数需要一个Lock对象作为参数,如果没有这个Lock对象参数,Condition将在内部自行创建一个RLock对象。在Condition对象上,当然可以调用acquire和release操作。因为内部的Lock对象本身就支持这些操作。但是Condition的价值在于提供wait和notify的语义。假设有Condition对象C,当线程A调用C.wait()时,线程A将释放C的Lock对象。并进入阻塞状态,知道有别的线程调用C.notify(),A才会重新通过acquire申请C中的Lock对象,并退出wait操作。

Event 

  与Semaphore类似,Event对象实际上也是对Condition对象的一种包装,只是提供了独有的set和wait语义。