[英]Is it required to grab v8::Locker before making v8::Function::Call?
我正在使用V8執行一些自定義的JavaScript代碼,從而將OnUpdate
函數暴露給JS world。 總體代碼可以正常工作,但是當前我擔心以下代碼的性能-是否需要抓取v8::Locker
才能執行任何用戶定義的功能? Instruments.app
顯示此處的代碼在v8::Locker
構造函數和析構函數中花費了太多時間-
90毫秒(實際執行代碼)VS〜4000ms(由Locker
& ~Locker
) -這是荒謬的,我覺得我可能會做一些錯誤。
所以我的基本問題是真的有必要抓住v8::Locker
來執行v8::Function::Call
嗎? 在當前狀態下,如果我注釋掉v8::Locker
則會收到以下錯誤消息:
# Fatal error in HandleScope::HandleScope
# Entering the V8 API without proper locking in place
程式碼片段:
int Bucket::send_doc_update_bucket(const char *msg) {
Locker locker(GetIsolate());
Isolate::Scope isolate_scope(GetIsolate());
HandleScope handle_scope(GetIsolate());
Local<Context> context = Local<Context>::New(GetIsolate(), context_);
Context::Scope context_scope(context);
TryCatch try_catch;
Local<Value> args[1];
args[0] = String::NewFromUtf8(GetIsolate(), msg);
assert(!try_catch.HasCaught());
Handle<Value> val;
if(!context->Global()->Get(context,
createUtf8String(GetIsolate(),
"OnUpdate")).ToLocal(&val) ||
!val->IsFunction()) {
return 3;
}
Handle<Function> on_doc_update = Handle<Function>::Cast(val);
on_doc_update->Call(context, context->Global(), 1, args);
if (try_catch.HasCaught()) {
//w->last_exception = ExceptionString(GetIsolate(), &try_catch);
return 2;
}
return 0;
}
如果您不執行任何多線程操作,則無需觸摸v8 :: Locker。 但是,一旦這樣做,就必須到處都有它。
v8 :: Locker用於阻止同一v8 :: Isolate中的多個v8 :: Context同時運行。
如果要同時執行多個線程,則必須在不同的隔離環境中創建每個上下文。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.