Согласно документации , 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 и сравнитерезультаты.
Почему поведение отличается?Я не понимаю этоПохоже на выбор дизайна, если да, то почему?
(Этот вопрос был первоначально размещен здесь . Не получил никакого ответа в течение длительного времени, я решил повторно опубликовать его.)