uv__queue_done: утверждение `((req-> loop) -> active_reqs.count> 0) 'не выполнено? - PullRequest
0 голосов
/ 12 марта 2019

Недавно мы тестировали Node.js с аддоном C ++ для масштабируемости обработки запросов.

Пожалуйста, выполните следующие шаги для большего понимания:

  1. Мы зарегистрировали функцию обратного вызова Node.js в дополнении C ++, которая вызывается (callback) из дополнения C ++ при поступлении запроса.

  2. Первоначальный запрос сначала попадет в аддон C ++, затем в функцию обратного вызова Node.js.

  3. Однако, если мы загрузим запросы более чем на час или около того ... произойдет сбой с указанной выше ошибкой.

Пожалуйста, посмотрите на приведенный ниже код. Начальный вызов sendData:

    struct Work {
      int status;
      uv_work_t request;
      string data;
      Persistent<Function> callback;
    };

    static void WorkAsync(uv_work_t *req) {
         //Work *work = static_cast<Work *>(req->data);
    }

    static void WorkAsyncComplete(uv_work_t *req, int status) {
       Isolate * isolate = Isolate::GetCurrent();
       v8::HandleScope handleScope(isolate); // Required for Node 4.x

       Work *work = static_cast<Work *>(req->data);

       Handle<Value> argv[1];
       argv[0] = String::NewFromUtf8(isolate, work->data.c_str());

       Local<Function>::New(isolate, m_work->callback)->Call(isolate->GetCurrentContext()->Global(), 1, argv);
       pthread_mutex_unlock(&queue_mutex);
   }
   void sendData(std::string str) {
      pthread_mutex_lock(&queue_mutex);
      m_work->data = str;
      uv_queue_work(uv_default_loop(),&m_work->request, WorkAsync, WorkAsyncComplete);
}

Спасибо

...