使Node.js退出,无论本地模块异步调用是否挂起

问题描述 投票:1回答:1

我正在为Node.js编写基于Napi的模块。

该模块使用WINAPI WaitForSingleObject(pid)。阻塞的WINAPI调用包装在Napi::AsyncWorker中。

问题

异步调用可防止Node.js退出。我希望Node.js在无事可做时退出,就像child_process.unref()一样。因此,我想取消引用Node.js事件循环中的异步调用。

node.js node.js-addon
1个回答
0
投票

我没有时间制作NPM软件包,但这是我的解决方案。该解决方案对所有阻塞的系统调用均有效(将调用线程置于等待状态,如Sleep()一样。)>

想法是:

  1. 使用std::thread阻止WINAPI调用。
  2. 使用std::thread从新线程安全地回调到Javascript。
  3. 使用napi_threadsafe_function从Node.js事件循环中取消引用异步操作。
  4. 更多详细信息:

  1. 为了进行安全的同时调用,请使用线程专用数据创建一个新的napi_threadsafe_function并进行传递(由N-API支持)。>>
  2. 对于未清除的napi_unref_threadsafe_function,支持终结器。在此处停止等待的线程以防止Node.js退出时出现崩溃消息。
  3. 我可以交替使用C napi_unref_threadsafe_function和C ++ void* context。不幸的是,在撰写本文时,纯C ++解决方案是不可能的,因为napi_threadsafe_function仅可从C API获得。
  4. addon.cc:

N-API
© www.soinside.com 2019 - 2024. All rights reserved.