在V8中,这些对象之间有什么区别或连接?上下文是否“属于”隔离或反之亦然?
我知道单个隔离一次只能由一个线程访问(我猜这就是v8 :: Locker的作用?)。
我已经查看了文档,但似乎无法掌握这些概念 - 欢迎任何帮助!
在V8中,这些对象之间有什么区别或连接?上下文是否“属于”隔离或反之亦然?
我知道单个隔离一次只能由一个线程访问(我猜这就是v8 :: Locker的作用?)。
我已经查看了文档,但似乎无法掌握这些概念 - 欢迎任何帮助!
我相信以下内容是简化的,但对我来说有效。
隔离是V8运行时的独立副本,包括堆管理器、垃圾回收器等。同一时间只有一个线程可以访问给定的隔离,但不同的线程可以同时访问不同的隔离。
然而,单独的隔离并不足以运行脚本。您还需要全局(根)对象。通过将隔离堆中的对象指定为全局对象,一个上下文定义了一个完整的脚本执行环境。
因此,许多上下文不仅可以“存在”于给定的隔离中,而且它们可以轻松而安全地共享任何或所有的对象。这是因为它们的对象实际上属于隔离,并受到隔离的独占锁的保护。
现在,在一个隔离中,你可能会有许多不相关的 JavaScript 应用程序同时运行。JavaScript 提供了许多全局级别的语言设施,让多个不相关的应用程序操纵这些“单例”并不是一个好主意。因此,在称为隔离的 V8 实例内,您可以定义多个上下文(Contexts),以便不相关的应用程序可以按照自己的需求执行而不会相互干扰。
这不是一个完美的比喻,但如果你知道 Java Web 相关的知识,可以想象在同一台机器上部署多个 Tomcat 实例,然后每个 Tomcat 实例运行具有自己的 Web 上下文和 web.xml 的单独应用程序。就有点像这样。
希望对你有所帮助。