我尝试开发一个与Isolate一起使用的异步Node.js插件。
考虑这个示例代码:
struct Work {
uv_work_t request;
Persistent<Function> callback;
Isolate * isolate;
};
// called in worker thread
static void WorkAsync(uv_work_t *req)
{
Work *work = static_cast<Work *>(req->data);
HeapStatistics stats;
work->isolate->GetHeapStatistics(&stats);
// ... do other stuff ...
}
// called by in main thread
static void WorkAsyncComplete(uv_work_t *req, int status)
{
Isolate * isolate = Isolate::GetCurrent();
v8::HandleScope handleScope(isolate);
Work *work = static_cast<Work *>(req->data);
// ... do other stuff ...
work->callback.Reset();
delete work;
}
void RunAsync(const v8::FunctionCallbackInfo<v8::Value>&args) {
Isolate* isolate = args.GetIsolate();
Work * work = new Work();
work->request.data = work;
work->isolate = isolate;
Local<Function> callback = Local<Function>::Cast(args[0]);
work->callback.Reset(isolate, callback);
// kick of the worker thread
uv_queue_work(uv_default_loop(), &work->request, WorkAsync, WorkAsyncComplete);
args.GetReturnValue().Set(Undefined(isolate));
}
void setup(Handle <Object> exports, Handle<Object> module) {
NODE_SET_METHOD(exports, "run", RunAsync);
}
NODE_MODULE(addon, setup)
我的问题:将指向当前Isolate的指针传递给工作线程是否安全(出于只读目的)?
谢谢!
答案 0 :(得分:0)
Scott Frees( C ++和Node.js集成电子书:https://scottfrees.com/ebooks/nodecpp/的作者)回答:
说实话,我从未尝试过这样做。在我看来它应该没问题 - 只要你只是对隔离进行调用而不是实际修改其中的任何内容。
一般来说,如果你试图做任何违反V8线程模型的事情,它会产生一个例外 - 所以如果不是,那我就认为没问题。
答案 1 :(得分:0)
是的,这是可能的。但是,您是安全的责任人。您需要确保Isolate从父线程中退出并解锁。然后它可以在工作线程中使用(Entred)。