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

标签 python multithreading

尝试用我的智慧来了解线程的工作原理。文档和源代码中的高级语言在一定程度上很有帮助,但仍然让我摸不着头脑。从数据结构的角度来看,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/

相关文章:

python - csh 标准输入到 Python 标准输入?

python - 在回调模式下使用 python 和 pyaudio 的线程问题

python - python中有内置的身份函数吗?

ruby-on-rails - Redis + ActionController::Live 线程不会死

python - Django 中 jinja2 模板的代码覆盖率

python - 如何在 python 2.7x 中展平嵌套字典

java - 如何从 Swing Gui 访问同步缓冲区?

python - sqlobject线程安全

objective-c - 如何在 iPhone 上使用带有线程的 sqlite + fdbm 库

java - 从带有线程的方法返回