gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:32:35 25 4
gpt4 key购买 nike

尝试用我的智慧来了解线程的工作原理。文档和源代码中的高级语言在一定程度上很有帮助,但仍然让我摸不着头脑。从数据结构的角度来看,ThreadCondition 对象之间的关系到底是什么?当线程“释放”锁时意味着什么? Condition 对象将其对线程的引用出队吗?在 Internet 上是否可以找到这些交互的底层描述(最好是用 Python 术语)?

最佳答案

Condition 维护一个列表(实际上是一个collections.deque),其中列出了等待条件的概念上的线程。它实际上存储等待线程被阻塞的锁,但如果您不太关心实现,则认为它存储线程是一个概念上的捷径。该列表最初是空的,但是每当线程调用 Conditionwait 方法时,它都会创建一个新锁并将其添加到列表中,然后再阻塞该锁(从概念上讲,这会将线程添加到列表中,并将其挂起)。当另一个线程调用 notifynotify_all 后,锁将从列表中删除,这会解锁列表中的一个或多个锁对象,从而唤醒相应的线程。

释放锁意味着解锁它。这是对 Lock 对象的基本操作(与 acquire 相反,它锁定 Lock)。锁在获取释放之间“持有”,并且在给定时间只有一个线程可以持有Lock(其他线程将阻塞acquire,或者操作将失败(可能在超时后)。在简单的情况下,您可以使用上下文管理器协议(protocol)来调用 acquirerelease:

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 操作(waitnotify 及其变体)要求您在调用它们之前已经持有关联的锁。您可以直接对 Condition 对象本身执行锁定操作,因为它代理 Lockacquirerelease 方法(以及等效的上下文管理器方法)。

Condition 类是用纯 Python 编写的,因此,如果您想了解它在低级别上的工作原理,可能没有比 the source code itself 更好的信息来源了。 !

了解如何使用条件来同步对对象的多线程访问也可能很有用。一个很好的例子是 the queue module在标准库中,每个Queue使用三个Condition(not_fullnot_emptyall_tasks_done) 来有效地管理尝试访问或修改其数据的线程。

关于python - threading.Condition 是否维护 Thread 对象的集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49834815/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com