В Windows, почему libuv откладывает обратный вызов ввода / вывода до следующего цикла? - PullRequest
0 голосов
/ 11 февраля 2019

Согласно документации , libuv выполняет обратные вызовы ввода / вывода на этапе POLL цикла перед любым обратным обратным вызовом 'check'.

Циклические блоки для ввода / вывода.В этот момент цикл будет блокироваться для ввода-вывода в течение времени ожидания, рассчитанного на предыдущем шаге.Все связанные с I / O дескрипторы, которые отслеживали заданный дескриптор файла для операции чтения или записи, в этот момент получают свои обратные вызовы с именем . .

Это верно для Linux.Но для Windows все иначе - libuv откладывает обратные вызовы ввода / вывода до следующего раунда.Это можно сделать из исходного кода .

success = GetQueuedCompletionStatusEx(loop->iocp,
                                      overlappeds,
                                      ARRAY_SIZE(overlappeds),
                                      &count,
                                      timeout,
                                      FALSE);

if (success) {
  for (i = 0; i < count; i++) {
    /* Package was dequeued, but see if it is not a empty package
     * meant only to wake us up.
     */
    if (overlappeds[i].lpOverlapped) {
      req = uv_overlapped_to_req(overlappeds[i].lpOverlapped);
      uv_insert_pending_req(loop, req);  <---------------------- WHAT?
    }
  }

Если вы не понимаете, о чем я, попробуйте мою демонстрационную программу для Windows и Linux и сравнитерезультаты.

Почему поведение отличается?Я не понимаю этоПохоже на выбор дизайна, если да, то почему?

(Этот вопрос был первоначально размещен здесь . Не получил никакого ответа в течение длительного времени, я решил повторно опубликовать его.)

...