我正在制作和插件(到nodejs)。我所拥有的一项功能是负责使用到达的音频进行快速算法。我的目标是在一个线程中执行该算法。这是该功能的简历:
void buffering(const FunctionCallbackInfo<v8::Value>& args) {
Isolate* isolate = Isolate::GetCurrent();
HandleScope scope(isolate);
int size = args[1]->NumberValue();
int final_read = args[2]->NumberValue();
int inicio_read = args[3]->NumberValue();
int client_id = args[4]->NumberValue();
Local<Object> bufferObj = args[0]->ToObject();
buf = node::Buffer::Data(bufferObj);
char mini_buf[80000];//char mini_buf[4096];
memcpy(mini_buf, buf, size);
//To implement a thread
int teste_buf = Julius[client_id].Audio_Buffering(mini_buf, size, final_read, inicio_read, client_id);
//(....returns to nodejs...)
}
如果Audio_Buffering
只执行了一次,我可以这样做:
std::thread t[num__threads];
t[client_id] = std::thread(&SREngineJulius::Audio_Buffering, &Julius[client_id], mini_buf, size, final_read,inicio_read,client_id);
碰巧的是,只要音频到来(由于服务器中的事件),就会执行此功能。所以我的目标是将执行放在一个线程中。可能是一样的吗?如果不是,我怎么能做到这一点?
答案 0 :(得分:0)
您的调用在主线程中处理,因此阻止JS运行。你应该在一个额外的线程中完成工作,但这将从根本上改变你的功能现在的工作方式。
基本上这会将你的功能分为三个部分:
验证:将输入数据(参数,缓冲区数据)复制出V8结构并从堆栈中复制出来。您不能在工作线程中调用任何V8函数。由于您的函数现在将是异步的,因此您还需要至少传递一个回调函数。
工作:在工作线程中完成工作并将输出存储在某处。
解决:返回主线程,将输出导入V8结构并调用回调。
详细说明:
我不会解释你如何获取数据,似乎你解决了这个问题。你必须将它存储在V8和你当前的堆栈框架之外的某个地方,我建议使用std::make_shared
创建一个结构,并在验证输入时填写。将回调存储为v8::Persistent<v8::Function>
;您还需要存储隔离物。
以您喜欢的方式开始您的主题。是否使用线程池。不要使用std::async
,因为您不能等待它。将指向您的数据的指针传递给它,然后让它完成工作。
从您的工作线程中,您需要返回主线程。您必须使用uv_async_send
中的uv.h
执行此操作(另请参阅uv_async_init
和uv_close
)。在主线程中,在v8::HandleScope
中,创建一个v8::Local<v8::Function>
并将其调用。