- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
尝试用我的智慧来了解线程
的工作原理。文档和源代码中的高级语言在一定程度上很有帮助,但仍然让我摸不着头脑。从数据结构的角度来看,Thread
和 Condition
对象之间的关系到底是什么?当线程“释放”锁时意味着什么? Condition
对象将其对线程的引用出队吗?在 Internet 上是否可以找到这些交互的底层描述(最好是用 Python 术语)?
最佳答案
Condition
维护一个列表(实际上是一个collections.deque
),其中列出了等待条件的概念上的线程。它实际上存储等待线程被阻塞的锁,但如果您不太关心实现,则认为它存储线程是一个概念上的捷径。该列表最初是空的,但是每当线程调用 Condition
的 wait
方法时,它都会创建一个新锁并将其添加到列表中,然后再阻塞该锁(从概念上讲,这会将线程添加到列表中,并将其挂起)。当另一个线程调用 notify
或 notify_all
后,锁将从列表中删除,这会解锁列表中的一个或多个锁对象,从而唤醒相应的线程。
释放锁意味着解锁它。这是对 Lock
对象的基本操作(与 acquire
相反,它锁定 Lock
)。锁在获取
和释放
之间“持有”,并且在给定时间只有一个线程可以持有Lock
(其他线程将阻塞acquire
,或者操作将失败(可能在超时后)。在简单的情况下,您可以使用上下文管理器协议(protocol)来调用 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 更好的信息来源了。 !
了解如何使用条件
来同步对对象的多线程访问也可能很有用。一个很好的例子是 the queue
module在标准库中,每个Queue
使用三个Condition
(not_full
、not_empty
和all_tasks_done
) 来有效地管理尝试访问或修改其数据的线程。
关于python - threading.Condition 是否维护 Thread 对象的集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49834815/
我的一位教授给了我们一些考试练习题,其中一个问题类似于下面(伪代码): a.setColor(blue); b.setColor(red); a = b; b.setColor(purple); b
我似乎经常使用这个测试 if( object && object !== "null" && object !== "undefined" ){ doSomething(); } 在对象上,我
C# Object/object 是值类型还是引用类型? 我检查过它们可以保留引用,但是这个引用不能用于更改对象。 using System; class MyClass { public s
我在通过 AJAX 发送 json 时遇到问题。 var data = [{"name": "Will", "surname": "Smith", "age": "40"},{"name": "Wil
当我尝试访问我的 View 中的对象 {{result}} 时(我从 Express js 服务器发送该对象),它只显示 [object][object]有谁知道如何获取 JSON 格式的值吗? 这是
我有不同类型的数据(可能是字符串、整数......)。这是一个简单的例子: public static void main(String[] args) { before("one"); }
嗨,我是 json 和 javascript 的新手。 我在这个网站找到了使用json数据作为表格的方法。 我很好奇为什么当我尝试使用 json 数据作为表时,我得到 [Object,Object]
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我听别人说 null == object 比 object == null check 例如: void m1(Object obj ) { if(null == obj) // Is thi
Match 对象 提供了对正则表达式匹配的只读属性的访问。 说明 Match 对象只能通过 RegExp 对象的 Execute 方法来创建,该方法实际上返回了 Match 对象的集合。所有的
Class 对象 使用 Class 语句创建的对象。提供了对类的各种事件的访问。 说明 不允许显式地将一个变量声明为 Class 类型。在 VBScript 的上下文中,“类对象”一词指的是用
Folder 对象 提供对文件夹所有属性的访问。 说明 以下代码举例说明如何获得 Folder 对象并查看它的属性: Function ShowDateCreated(f
File 对象 提供对文件的所有属性的访问。 说明 以下代码举例说明如何获得一个 File 对象并查看它的属性: Function ShowDateCreated(fil
Drive 对象 提供对磁盘驱动器或网络共享的属性的访问。 说明 以下代码举例说明如何使用 Drive 对象访问驱动器的属性: Function ShowFreeSpac
FileSystemObject 对象 提供对计算机文件系统的访问。 说明 以下代码举例说明如何使用 FileSystemObject 对象返回一个 TextStream 对象,此对象可以被读
我是 javascript OOP 的新手,我认为这是一个相对基本的问题,但我无法通过搜索网络找到任何帮助。我是否遗漏了什么,或者我只是以错误的方式解决了这个问题? 这是我的示例代码: functio
我可以很容易地创造出很多不同的对象。例如像这样: var myObject = { myFunction: function () { return ""; } };
function Person(fname, lname) { this.fname = fname, this.lname = lname, this.getName = function()
任何人都可以向我解释为什么下面的代码给出 (object, Object) 吗? (console.log(dope) 给出了它应该的内容,但在 JSON.stringify 和 JSON.parse
我正在尝试完成散点图 exercise来自免费代码营。然而,我现在只自己学习了 d3 几个小时,在遵循 lynda.com 的教程后,我一直在尝试确定如何在工具提示中显示特定数据。 This code
我是一名优秀的程序员,十分优秀!