2017-05-12 27 views
2

我需要从节点插件调用Javascript函数。插件将有一个连续运行的后台线程,所以它不是使用async_queue_work的经典异步工作者需求。我认为uv_async_send在这种情况下更合适。我希望在节点空闲时立即执行节点事件循环中的函数。这个函数应该在主节点线程中运行。使用libuv和uv_async_send的节点插件 - 节点进程不会退出

要开始我有一个非常简单的插件,我正在试验uv_queue_work vs uv_async_send。我可以同时工作,但在uv_async_send的情况下,节点进程永远不会退出。

node-uv.cc

#include <node.h> 
#include <uv.h> 

using namespace v8; 

static void Runner(uv_work_t *req) 
{ 
    printf("Async work running!\n"); 
} 

static void RunDone(uv_work_t *req, int status) 
{ 
    delete req; 
    printf("Async work done!\n"); 
} 

static void Runner2(uv_async_t* handle) { 
    printf("Got async send!\n"); 
} 

void Start(const FunctionCallbackInfo<Value>& args) 
{ 
    printf("In run async\n"); 

    Isolate* isolate = Isolate::GetCurrent(); 
    HandleScope scope(isolate); 

    uv_work_t *req = (uv_work_t*)malloc(sizeof(uv_work_t)); 

    /// Example using uv_queue_work (working fine) 
    printf("Queue work\n"); 
    uv_queue_work(uv_default_loop(), req, &Runner, &RunDone); 

    uv_async_t *handle = (uv_async_t*)malloc(sizeof(uv_async_t)); 
    uv_async_init(uv_default_loop(), handle, &Runner2); 

    /// Example using uv_async_send (node does not terminate) 
    printf("Async send\n"); 
    uv_async_send(handle); 
} 

void Init(Handle<Object> exports, Handle<Object> module) 
{ 
    NODE_SET_METHOD(exports, "start", Start); 
} 

NODE_MODULE(node_uv, Init) 

输出

$ node test 
calling addon 
In run async 
Queue work 
Async send 
Async work running! 
called addon 
Got async send! 
Async work done! 

(过程不会在此时退出)

完整的示例项目是在这里:https://github.com/jugglingcats/node-uv

非常感谢任何帮助。

回答