【问题标题】:What exactly is the difference between v8::Isolate and v8::Context?v8::Isolate 和 v8::Context 之间到底有什么区别?
【发布时间】:2013-10-15 14:24:42
【问题描述】:

V8 中这些对象之间的区别/联系是什么?上下文是否“属于”一个 Isolate,反之亦然?

我知道单个 Isolate 一次只能被一个线程访问(我猜这就是 v8::Locker 的用途?)。

我查看了文档,但似乎无法掌握这些概念 - 任何帮助表示感谢!

【问题讨论】:

    标签: v8 embedded-v8


    【解决方案1】:

    我确信以下是简化的,但它对我有用。

    isolate 是 V8 运行时的独立副本,包括堆管理器、垃圾收集器等。一次只能有一个线程访问给定的isolate,但不同的线程可能访问不同的同时分离。

    但是,隔离不足以运行脚本。您还需要一个全局(根)对象。 context 通过将隔离堆中的对象指定为全局对象来定义完整的脚本执行环境。

    因此,不仅可以在给定的隔离中“存在”许多上下文,而且它们还可以轻松安全地共享任何或所有对象。那是因为它们的对象实际上属于isolate,并且受到isolate的排他锁的保护。

    【讨论】:

    • 最后一段比 v8isolate 和 v8context 的实际概念更让我困惑。如果对象存储在一个上下文中,多个上下文如何共享对象?
    • 对象存储在隔离的堆中,因此可以在隔离内的所有上下文之间共享。
    【解决方案2】:

    Isolates,顾名思义,对外界完全封闭,所以Isolates 可以并行运行,因为它们完全是 V8 的不同实例。将Isolate 视为一个沙箱——一个V8 运行时环境。

    现在在Isolate 中,您可能有许多不相关的 JavaScript 应用程序同时运行。 JavaScript 提供了许多全局级别的语言工具,让多个不相关的应用程序与这些“单例”混为一谈并不是一个好主意。因此,在一个名为 Isolate 的 V8 实例中,您可以定义多个 Contexts,以便不相关的应用程序可以做他们需要做的事情,而不会相互干扰。

    这不是一个完美的类比,但如果您了解 Java Web 知识,想象一下在同一台机器上部署的多个 Tomcat 实例,然后每个 Tomcat 实例运行具有自己的 Web 上下文和 web.xml 的单独应用程序。有点像。

    希望对您有所帮助。

    【讨论】:

    • 隔离共享相同的平台信息,因此它们不是完全隔离的。它们“完全”不同
    猜你喜欢
    • 2018-02-05
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 2022-08-09
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    相关资源
    最近更新 更多