尝试用我的智慧来了解线程
的工作原理。文档和源代码中的高级语言在一定程度上很有帮助,但仍然让我摸不着头脑。从数据结构的角度来看,Thread
和 Condition
对象之间的关系到底是什么?当线程“释放”锁时意味着什么? Condition
对象将其对线程的引用出队吗?在 Internet 上是否可以找到这些交互的底层描述(最好是用 Python 术语)?
最佳答案
Condition
维护一个列表(实际上是一个collections.deque
),其中列出了等待条件的概念上的线程。它实际上存储等待线程被阻塞的锁,但如果您不太关心实现,则认为它存储线程是一个概念上的捷径。该列表最初是空的,但是每当线程调用 Condition
的 wait
方法时,它都会创建一个新锁并将其添加到列表中,然后再阻塞该锁(从概念上讲,这会将线程添加到列表中,并将其挂起)。当另一个线程调用 notify
或 notify_all
后,锁将从列表中删除,这会解锁列表中的一个或多个锁对象,从而唤醒相应的线程。
释放锁意味着解锁它。这是对 Lock
对象的基本操作(与 acquire
相反,它锁定 Lock
)。锁在获取
和释放
之间“持有”,并且在给定时间只有一个线程可以持有Lock
(其他线程将阻塞acquire
,或者操作将失败(可能在超时后)。在简单的情况下,您可以使用上下文管理器协议(protocol)来调用 acquire
和 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
关联,它可以是您传递给其构造函数的预先存在的锁,也可以是它在内部为您创建的锁(如果您不这样做)不传递任何东西)。主要的 Condition
操作(wait
和 notify
及其变体)要求您在调用它们之前已经持有关联的锁。您可以直接对 Condition
对象本身执行锁定操作,因为它代理 Lock
的 acquire
和 release
方法(以及等效的上下文管理器方法)。
Condition
类是用纯 Python 编写的,因此,如果您想了解它在低级别上的工作原理,可能没有比 the source code itself 更好的信息来源了。 !
了解如何使用条件
来同步对对象的多线程访问也可能很有用。一个很好的例子是 the queue
module在标准库中,每个Queue
使用三个Condition
(not_full
、not_empty
和all_tasks_done
) 来有效地管理尝试访问或修改其数据的线程。
关于python - threading.Condition 是否维护 Thread 对象的集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49834815/