0

我是 Google V8 的新手,我不确定如何充分使用它们提供的变量类型。我将首先解释我希望流动的内容:

  1. 在主线程中,我想编译 JS 脚本。
  2. 在几个线程中,当我使用 instance->SetAccessor(...) 或 prototype->Set(...) (或任何其他选项,如果有的话)“添加”到上下文不同的信息时,我想运行脚本。

我不确定何时需要执行以下操作:

  • 何时何地创建v8::handleScope?在主线程中创建一个就足够了吗?或者我每个线程都需要一个?
  • 何时何地创建v8::isolatev8::locker?它应该是每个线程吗?应该在之前还是之后v8::handleScope

任何信息都会有所帮助(:

4

1 回答 1

1

如果您想从每个线程并行运行脚本而没有跨线程共享,那么每个线程都需要自己的隔离。您可能需要也可能不需要主线程,或者您可以使用默认隔离。我建议确保在运行任何线程之前已初始化默认隔离,以防万一您的其他线程之一最终初始化它。如果您使用隔离物,您应该没问题,但可以肯定的是它不会造成任何伤害。

如果您需要对象等的跨线程共享,那么您需要对此进行研究,这可能会很困难。甚至不确定 v8 是否真的可以支持它。拥有单独的隔离区并避免共享对象要容易得多。

您应该能够在一个隔离的上下文中编译您的脚本,该隔离旨在用于将在主线程中执行它的线程,然后将脚本和隔离传递给线程,并且在主线程中不再触及任何一个,直到工作线程完成了它。这应该可以工作,但是我没有检查 v8 是否检查了创建隔离的线程 ID 和执行它的线程 ID。值得编写一个小测试应用程序来检查它是否可以工作。

另一种选择是在主线程中检查编译并在工作线程中再次编译并将隔离封装在线程中。这是我过去的做法。它更容易但效率较低。

句柄范围应仅在需要的函数中分配在堆栈上。不要为句柄范围使用全局变量或在堆上分配它。您编译的脚本应该使用持久句柄。进入隔离范围后进入句柄范围。

于 2012-05-09T11:46:07.763 回答