尝试围绕threading
的工作原理。文档和源代码中的高级语言在一定程度上是有用的,但仍然让我摸不着头脑。就数据结构而言,究竟究竟是Thread
和Condition
个对象之间的关系?线程“释放”锁定意味着什么? Condition
对象将其对线程的引用出列?是否有关于这些交互的较低级别描述,最好是用Python术语,可以在因特网上找到?
答案 0 :(得分:1)
Condition
维护一个名单线程的列表(实际上是collections.deque
),等待条件。它实际上存储了等待线程被阻塞的锁,但如果你不太关心实现,那么考虑存储线程是一个概念上的捷径。该列表最初是空的,但是一旦线程调用Condition
的{{1}}方法,它就会创建一个新的锁并将其添加到列表中,然后阻塞锁(概念上,这会将线程添加到列表中,并将其挂起)。在另一个线程调用wait
或notify
后,锁会从列表中删除,这会解锁列表中的一个或多个锁定对象,唤醒相应的线程。
释放锁意味着解锁。它是notify_all
对象的基本操作(Lock
的反向,锁定acquire
)。锁定是“#34;持有"在Lock
和acquire
之间,并且在给定时间只有一个线程可以容纳release
(其他线程将在Lock
中阻塞,否则操作将失败,也许是在超时后)。在简单的情况下,您可以使用上下文管理器协议为您调用acquire
和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
的{{1}}和Lock
方法(以及等效的上下文管理器方法) )。
acquire
类是用纯Python编写的,所以如果你想知道它在低级别上是如何工作的,那么可能没有比the source code itself更好的信息来源!
查看release
如何用于同步对象的多线程访问可能也很有用。一个很好的例子是标准库中的the queue
module,其中每个Condition
使用三个Condition
s Queue
,Condition
和not_full
)有效地管理试图访问或修改其数据的线程。