v8 :: Isolate和v8 :: Context之间究竟有什么区别?

时间:2013-10-15 14:24:42

标签: v8 embedded-v8

V8中这些对象之间的区别/连接是什么?上下文“属于”孤立,反之亦然吗?

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

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

2 个答案:

答案 0 :(得分:35)

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

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

但是,

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

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

答案 1 :(得分:33)

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

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

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

希望有所帮助。