threading.Condition是否维护Thread对象的集合?

时间:2018-04-14 18:30:43

标签: python multithreading

尝试围绕threading的工作原理。文档和源代码中的高级语言在一定程度上是有用的,但仍然让我摸不着头脑。就数据结构而言,究竟究竟是ThreadCondition个对象之间的关系?线程“释放”锁定意味着什么? Condition对象将其对线程的引用出列?是否有关于这些交互的较低级别描述,最好是用Python术语,可以在因特网上找到?

1 个答案:

答案 0 :(得分:1)

Condition维护一个名单线程的列表(实际上是collections.deque),等待条件。它实际上存储了等待线程被阻塞的锁,但如果你不太关心实现,那么考虑存储线程是一个概念上的捷径。该列表最初是空的,但是一旦线程调用Condition的{​​{1}}方法,它就会创建一个新的锁并将其添加到列表中,然后阻塞锁(概念上,这会将线程添加到列表中,并将其挂起)。在另一个线程调用waitnotify后,锁会从列表中删除,这会解锁列表中的一个或多个锁定对象,唤醒相应的线程。

释放锁意味着解锁。它是notify_all对象的基本操作(Lock的反向,锁定acquire)。锁定是“#34;持有"在Lockacquire之间,并且在给定时间只有一个线程可以容纳release(其他线程将在Lock中阻塞,否则操作将失败,也许是在超时后)。在简单的情况下,您可以使用上下文管理器协议为您调用acquireacquire

release

每个with some_lock: # this acquires some_lock, blocking until it's available do_stuff() # some_lock is held while this runs # some_lock will be released automatically when the with block ends 对象都与Condition相关联,可以是您传递给构造函数的预先存在的对象,也可以是内部为您创建的对象(如果您没有通过任何内容) )。主要的Lock操作(Conditionwait及其变体)要求您在调用之前已经保留了相关的锁。您可以直接在notify对象本身上执行锁定操作,因为它代理Condition的{​​{1}}和Lock方法(以及等效的上下文管理器方法) )。

acquire类是用纯Python编写的,所以如果你想知道它在低级别上是如何工作的,那么可能没有比the source code itself更好的信息来源!

查看release如何用于同步对象的多线程访问可能也很有用。一个很好的例子是标准库中的the queue module,其中每个Condition使用三个Condition s QueueConditionnot_full)有效地管理试图访问或修改其数据的线程。