2024-04-26 17:59:56 发布
网友
试着用我的智慧来理解threading的工作原理。文档和源代码中的高级语言在某种程度上是有用的,但仍然让我挠头。在数据结构方面,Thread和Condition对象之间的关系到底是什么?线程“释放”锁意味着什么?Condition对象是否将其对线程的引用出列?这些交互是否有较低层次的描述,最好是用Python术语,可以在Internet上找到?你知道吗
threading
Thread
Condition
一个Condition维护一个列表(实际上是一个collections.deque),其中包含了一些概念上的线程,它们在等待条件。它实际上存储了等待线程被阻塞的锁,但是如果您不太关心实现,那么认为存储线程是一种概念上的快捷方式。列表最初是空的,但每当线程调用Condition的wait方法时,它都会创建一个新锁并将其添加到列表中,然后再阻塞锁(从概念上讲,这会将线程添加到列表中,并挂起它)。在另一个线程调用notify或notify_all后,锁将从列表中移除,这将解锁列表中的一个或多个锁对象,从而唤醒相应的线程。你知道吗
collections.deque
wait
notify
notify_all
释放锁意味着解锁。它是对Lock对象的基本操作(与acquire相反,锁定Lock)。锁被“保持”在acquire和release之间,并且在给定时间只有一个线程可以保持Lock(其他线程将在acquire中阻塞,或者操作将失败,可能是在超时之后)。在简单的情况下,可以使用上下文管理器协议为您调用acquire和release:
Lock
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更好的信息源了!你知道吗
了解如何使用Condition来同步对对象的多线程访问可能也很有用。一个很好的例子是标准库中的the ^{} module,其中每个Queue使用三个Condition(not_full、not_empty和all_tasks_done)有效地管理试图访问或修改其数据的线程。你知道吗
Queue
not_full
not_empty
all_tasks_done
一个
Condition
维护一个列表(实际上是一个collections.deque
),其中包含了一些概念上的线程,它们在等待条件。它实际上存储了等待线程被阻塞的锁,但是如果您不太关心实现,那么认为存储线程是一种概念上的快捷方式。列表最初是空的,但每当线程调用Condition
的wait
方法时,它都会创建一个新锁并将其添加到列表中,然后再阻塞锁(从概念上讲,这会将线程添加到列表中,并挂起它)。在另一个线程调用notify
或notify_all
后,锁将从列表中移除,这将解锁列表中的一个或多个锁对象,从而唤醒相应的线程。你知道吗释放锁意味着解锁。它是对
Lock
对象的基本操作(与acquire
相反,锁定Lock
)。锁被“保持”在acquire
和release
之间,并且在给定时间只有一个线程可以保持Lock
(其他线程将在acquire
中阻塞,或者操作将失败,可能是在超时之后)。在简单的情况下,可以使用上下文管理器协议为您调用acquire
和release
:每个
Condition
对象都与一个Lock
相关联,要么是您传递给它的构造函数的一个预先存在的对象,要么是它在内部为您创建的一个对象(如果您不传递任何内容)。主要的Condition
操作(wait
和notify
,以及它们的变体)要求在调用它们之前已经持有关联的锁。您可以直接对Condition
对象本身执行锁定操作,因为它代理Lock
的acquire
和release
方法(以及等效的上下文管理器方法)。你知道吗Condition
类是用纯Python编写的,因此如果您想知道它在低级别上是如何工作的,那么可能没有比the source code itself更好的信息源了!你知道吗了解如何使用} module ,其中每个
Condition
来同步对对象的多线程访问可能也很有用。一个很好的例子是标准库中的the ^{Queue
使用三个Condition
(not_full
、not_empty
和all_tasks_done
)有效地管理试图访问或修改其数据的线程。你知道吗相关问题 更多 >
编程相关推荐