【发布时间】:2013-10-15 14:24:42
【问题描述】:
V8 中这些对象之间的区别/联系是什么?上下文是否“属于”一个 Isolate,反之亦然?
我知道单个 Isolate 一次只能被一个线程访问(我猜这就是 v8::Locker 的用途?)。
我查看了文档,但似乎无法掌握这些概念 - 任何帮助表示感谢!
【问题讨论】:
标签: v8 embedded-v8
V8 中这些对象之间的区别/联系是什么?上下文是否“属于”一个 Isolate,反之亦然?
我知道单个 Isolate 一次只能被一个线程访问(我猜这就是 v8::Locker 的用途?)。
我查看了文档,但似乎无法掌握这些概念 - 任何帮助表示感谢!
【问题讨论】:
标签: v8 embedded-v8
我确信以下是简化的,但它对我有用。
isolate 是 V8 运行时的独立副本,包括堆管理器、垃圾收集器等。一次只能有一个线程访问给定的isolate,但不同的线程可能访问不同的同时分离。
但是,隔离不足以运行脚本。您还需要一个全局(根)对象。 context 通过将隔离堆中的对象指定为全局对象来定义完整的脚本执行环境。
因此,不仅可以在给定的隔离中“存在”许多上下文,而且它们还可以轻松安全地共享任何或所有对象。那是因为它们的对象实际上属于isolate,并且受到isolate的排他锁的保护。
【讨论】:
Isolates,顾名思义,对外界完全封闭,所以Isolates 可以并行运行,因为它们完全是 V8 的不同实例。将Isolate 视为一个沙箱——一个V8 运行时环境。
现在在Isolate 中,您可能有许多不相关的 JavaScript 应用程序同时运行。 JavaScript 提供了许多全局级别的语言工具,让多个不相关的应用程序与这些“单例”混为一谈并不是一个好主意。因此,在一个名为 Isolate 的 V8 实例中,您可以定义多个 Contexts,以便不相关的应用程序可以做他们需要做的事情,而不会相互干扰。
这不是一个完美的类比,但如果您了解 Java Web 知识,想象一下在同一台机器上部署的多个 Tomcat 实例,然后每个 Tomcat 实例运行具有自己的 Web 上下文和 web.xml 的单独应用程序。有点像。
希望对您有所帮助。
【讨论】: