我现在正在试验V8.我希望能够在一个线程中运行一些(可能是长时间运行的)javascript,然后能够从另一个线程"优雅地"终止执行.
我写了这个简单的片段来测试Lockers的概念和TerminateExecution的用法:
void breaker( Isolate* isolate, int tid ) {
getchar(); //wait for keyboard input on stdin
std::cout << "Breaking V8 execution" << std::endl;
v8::Locker locker( isolate ); //lock the isolate
v8::V8::TerminateExecution( tid ); //and terminate it
}
int main( int argc, char **argv ) {
if( argc != 2 ) {
std::cout << "No script name given" << std::endl;
return 1;
}
Isolate* isolate = Isolate::New(); //create a new isolate
Isolate::Scope isolateScope( isolate ); //enter it
v8::Locker locker( isolate ); //lock the isolate
v8::Locker::StartPreemption( 100 ); //and start preemption
v8::HandleScope handle_scope( isolate ); //open a new handle scope
/*** inject a console object into the global context ***/
v8::Handle<v8::ObjectTemplate> globalTemplate = v8::ObjectTemplate::New();
Handle<Context> context = Context::New( NULL, globalTemplate );
v8::Context::Scope context_scope( context );
Console* console = new Console;
Handle<Object> jsConsole = wrap_console( isolate, console );
expose_property( jsConsole, String::New( "log" ), InvocationCallback( Console::consoleLog ) );
context->Global()->Set( String::New( "console" ), jsConsole, v8::ReadOnly );
/*******************************************************/
//read a javascript file supplied via console
std::string contents = read_file( argv[1] );
v8::Handle<v8::String> js = v8::String::New( contents.c_str() );
v8::TryCatch try_catch;
v8::Handle<v8::Script> script = v8::Script::Compile( js );
if( script.IsEmpty() ) {
report_exception( try_catch );
}
//start the breaker thread
std::thread th( breaker, isolate, v8::V8::GetCurrentThreadId() );
log_info( "running script" );
script->Run();
log_info( "Script execution finished" );
th.join();
}
Run Code Online (Sandbox Code Playgroud)
但是,我总是在terminateExecution()通话中遇到段错误.我在这做错了什么?
谢谢你的帮助
这些v8::V8::GetCurrentThreadId()和v8::V8::TerminateExecution(int)方法已从V8 API中删除.我建议你不要使用它们.对于这个世界而言,抢占功能可能也不长.
相反,只需打电话v8::V8::TerminateExecution(v8::Isolate*).并且不要将隔离锁定在断路器线程中,因为这样做会阻塞,直到您的转轮线程释放隔离,直到脚本执行完成后才会执行此操作.
| 归档时间: |
|
| 查看次数: |
1299 次 |
| 最近记录: |