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

DeX*_*eX3 39 v8 embedded-v8

V8中这些对象之间有什么区别/连接?上下文"属于"Isolate,反之亦然?

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

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

Bit*_*tex 40

我确信以下是简化,但它适用于我.

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

但是,隔离不足以运行脚本.您还需要一个全局(根)对象.一个方面通过在分离的堆指定的对象作为全局对象定义一个完整的脚本执行环境.

因此,不仅可以在给定的隔离中"存在"许多上下文,而且它们还可以容易且安全地共享其任何或所有对象.这是因为它们的对象实际上属于隔离区,并受隔离区的独占锁保护.

  • 最后一段比 v8isolate 和 v8context 的实际概念更让我困惑。如果对象存储在一个上下文中,那么多个上下文如何共享对象? (2认同)
  • 对象存储在隔离堆中,因此可以在隔离区中的所有上下文之间共享. (2认同)

Vid*_*dya 37

Isolates顾名思义,它完全与外界隔离,因此Isolates可以并行运行,因为它们完全是V8的不同实例.可以将其Isolate视为沙盒 - V8运行时环境.

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

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

希望有所帮助.