做穿线条件维护线程对象的集合?

2024-04-26 17:59:56 发布

您现在位置:Python中文网/ 问答频道 /正文

试着用我的智慧来理解threading的工作原理。文档和源代码中的高级语言在某种程度上是有用的,但仍然让我挠头。在数据结构方面,ThreadCondition对象之间的关系到底是什么?线程“释放”锁意味着什么?Condition对象是否将其对线程的引用出列?这些交互是否有较低层次的描述,最好是用Python术语,可以在Internet上找到?你知道吗


Tags: 对象文档语言数据结构源代码关系condition线程
1条回答
网友
1楼 · 发布于 2024-04-26 17:59:56

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

释放锁意味着解锁。它是对Lock对象的基本操作(与acquire相反,锁定Lock)。锁被“保持”在acquirerelease之间,并且在给定时间只有一个线程可以保持Lock(其他线程将在acquire中阻塞,或者操作将失败,可能是在超时之后)。在简单的情况下,可以使用上下文管理器协议为您调用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更好的信息源了!你知道吗

了解如何使用Condition来同步对对象的多线程访问可能也很有用。一个很好的例子是标准库中的the ^{} module,其中每个Queue使用三个Conditionnot_fullnot_emptyall_tasks_done)有效地管理试图访问或修改其数据的线程。你知道吗

相关问题 更多 >