【问题标题】:Node addon using libuv and uv_async_send -- node process doesn't exit使用 libuv 和 uv_async_send 的节点插件——节点进程不退出
【发布时间】:2017-05-12 10:51:30
【问题描述】:

我需要从节点插件调用 Javascript 函数。该插件将有一个连续运行的后台线程,因此它不是使用async_queue_work 的经典异步工作者要求。我认为 uv_async_send 在这种情况下更合适。我想在节点事件循环上放置一个函数,以便在节点空闲时立即执行。这个函数应该在主节点线程中运行。

首先我有一个非常简单的插件,我正在试验uv_queue_workuv_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

非常感谢任何帮助。

【问题讨论】:

    标签: javascript node.js libuv


    【解决方案1】:

    问题是我没有打电话给uv_close!!必须是简单的东西。

    修正回调方法

    static void Runner2(uv_async_t* handle) {
        printf("Got async send! %d\n", n++);
        uv_close((uv_handle_t *)handle, NULL);
    }
    

    相关文档:https://nikhilm.github.io/uvbook/threads.html

    修复github项目:https://github.com/jugglingcats/node-uv/tree/working

    【讨论】:

      猜你喜欢
      • 2015-08-03
      • 2013-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-20
      • 2018-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多