使Node.js退出,无论本地模块异步调用是否挂起
我正在为Node.js编写基于Napi的模块。
该模块使用WINAPI WaitForSingleObject(pid)
。阻塞的WINAPI调用包装在Napi::AsyncWorker
中。
问题
异步调用可防止Node.js退出。我希望Node.js在无事可做时退出,就像child_process.unref()
一样。因此,我想取消引用Node.js事件循环中的异步调用。
我没有时间制作NPM软件包,但这是我的解决方案。该解决方案对所有阻塞的系统调用均有效(将调用线程置于等待状态,如Sleep()
一样。)>
想法是:
- 使用
std::thread
阻止WINAPI调用。 - 使用
std::thread
从新线程安全地回调到Javascript。 - 使用
napi_threadsafe_function
从Node.js事件循环中取消引用异步操作。
更多详细信息:
- 为了进行安全的同时调用,请使用线程专用数据创建一个新的
napi_threadsafe_function
并进行传递(由N-API支持)。>> - 对于未清除的
napi_unref_threadsafe_function
,支持终结器。在此处停止等待的线程以防止Node.js退出时出现崩溃消息。 - 我可以交替使用C
napi_unref_threadsafe_function
和C ++void* context
。不幸的是,在撰写本文时,纯C ++解决方案是不可能的,因为napi_threadsafe_function
仅可从C API获得。
addon:
N-API
使Node.js退出,无论本地模块异步调用是否挂起
我正在为Node.js编写基于Napi的模块。
该模块使用WINAPI WaitForSingleObject(pid)
。阻塞的WINAPI调用包装在Napi::AsyncWorker
中。
问题
异步调用可防止Node.js退出。我希望Node.js在无事可做时退出,就像child_process.unref()
一样。因此,我想取消引用Node.js事件循环中的异步调用。
我没有时间制作NPM软件包,但这是我的解决方案。该解决方案对所有阻塞的系统调用均有效(将调用线程置于等待状态,如Sleep()
一样。)>
想法是:
- 使用
std::thread
阻止WINAPI调用。 - 使用
std::thread
从新线程安全地回调到Javascript。 - 使用
napi_threadsafe_function
从Node.js事件循环中取消引用异步操作。
更多详细信息:
- 为了进行安全的同时调用,请使用线程专用数据创建一个新的
napi_threadsafe_function
并进行传递(由N-API支持)。>> - 对于未清除的
napi_unref_threadsafe_function
,支持终结器。在此处停止等待的线程以防止Node.js退出时出现崩溃消息。 - 我可以交替使用C
napi_unref_threadsafe_function
和C ++void* context
。不幸的是,在撰写本文时,纯C ++解决方案是不可能的,因为napi_threadsafe_function
仅可从C API获得。
addon:
N-API