一些进展.发送未到达nodejs的调用

Some progress.Send calls not making it to nodejs land

本文关键字:nodejs 调用      更新时间:2023-10-16

我已经使用AsyncProgressWorker thread制作了一个Node插件来处理我的套接字消息。这是我的代码:

class ProgressWorker : public AsyncProgressWorker {
public:
ProgressWorker(
Callback *callback
, Callback *progress)
: AsyncProgressWorker(callback), progress(progress) {}
~ProgressWorker() {}
void Execute (const AsyncProgressWorker::ExecutionProgress& progress) {
char response[4096];
int result;
int connected = 1;
int timeout = 0;
int pending = 0;
while(connected) {
result = sctp_recvmsg(sock, (void *)&response, (size_t)sizeof(response), NULL, 0, 0, 0);
if (result > 0 && result < 4095) {
if (debug) {
printf("Server replied (size %d)n", result);
}
pending = 0;
progress.Send((const char *)response, size_t(result));
result = 0;
}
else {
// Don't mind my timeout mechanism. :))
if ((result == -1 && errno != EWOULDBLOCK) || pending) {
if (timeout == 0) {
printf("Can't receive from other end. Waiting for 3 seconds. Error code: %dn", errno);
pending = 1;
}
if (timeout >= 3000) {
connected = 0;
close(sock);
}
else {
timeout += 5;
usleep(5000);
}
}
else {
usleep(5000);
}
}
}
}
void HandleProgressCallback(const char *data, size_t count) {
HandleScope scope;
v8::Local<v8::Value> argv[] = {
CopyBuffer(const_cast<char*>(data), count).ToLocalChecked()
};
progress->Call(1, argv); // This is the callback to nodejs
}
private:
Callback *progress;
};

现在我直到今晚才对此进行压力测试,然后我注意到某些消息无法返回到节点。它将打印我的"服务器回复"调试日志,但不会记录我放在进度回调中的调试日志。我在这里错过了什么吗?提前谢谢。

AsyncProgressWorker是基于一个uv_async_t,它允许任何线程唤醒主线程。 但是,如文档中所述:

libuv 将合并对 uv_async_send() 的调用,也就是说,不是每个调用 将产生回调的执行。例如:如果 uv_async_send() 在回调之前连续调用 5 次 调用,则回调只会调用一次。如果 uv_async_send() 是 调用回调后再次调用,将再次调用。

^^ 这就是在应用程序处于压力下有时可能不会收到某些事件的原因。 这一行上方是问题的答案。 以下是我处理您的问题的"超越"可能的解决方案:

碰巧的是,我正在努力为AsyncProgressWorker添加一个新的替代方案,该替代方案承诺像AsyncProgressWorker一样提供每个事件,但使用队列。 此功能最近已合并到NAN中。如果要测试它,请在 https://github.com/nodejs/nan 尝试 git 存储库,然后将AsyncProgressWorker替换为AsyncProgressQueueWorker<char>重新运行测试,所有事件都将被传递。

添加此新功能的拉取请求在此处:https://github.com/nodejs/nan/pull/692 - 于 2017 年 10 月 6 日合并。

此新功能在NAN版本 2.8.0 中发布

您可以通过将package.json更改为使用 nan 版本 2.8.0 或更高版本来使用此新类模板:

"dependencies": {
"nan": "^2.8.0"
},