有一些进展。发送电话不要到nodejs土地

我已经做了一个使用AsyncProgressWorker线程处理我的套接字消息的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: %d\n", 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; }; 

现在我没有压力testing,直到今天晚上,我注意到有些消息不会回到节点。 它将打印我的“服务器应答”debugging日志,但不会logging我放在进度callback的debugging日志。 我在这里错过了什么? 提前致谢。

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

libuv会将调用合并到uv_async_send(),也就是说,不是每个调用都会产生callback的执行。 例如:如果在调用callback之前,uv_async_send()被连续调用5次,callback函数只会被调用一次。 如果在调用callback之后再次调用uv_async_send(),它将被再次调用。

^^这就是你的申请受到压力时有时候可能不会收到一些事件的原因。 在这条线上方是问题的答案。 下面是我的“超越”可能的解决scheme来处理你的问题:

恰巧我正在为AsyncProgressWorker添加一个新的替代scheme,它承诺像AsyncProgressWorker一样传递每个事件,但使用一个队列。 这个function最近被合并到了NAN中 。 如果你想testing它,试试在https://github.com/nodejs/nan,git仓库,然后&#x7528;AsyncProgressWorkerreplace你的AsyncProgressQueueWorker<char>重新运行你的testing,所有的事件将被交付。

添加这个新function的请求在这里: https : //github.com/nodejs/nan/pull/692 – 于2017年10月6日合并。

这个新function在NAN 2.8.0版本中发布

你可以通过改变你的package.json使用这个新的类模板来使用nan版本2.8.0或更高版本:

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