根据documentation,libuv在循环的POLL
阶段执行I / O回调,然后执行任何“检查”回调。
- I / O的循环块。此时,循环将阻止上一步计算的超时的I / O。正在监视给定文件描述符以进行读或写操作的所有与I / O相关的句柄,此时都将其回调称为 。
在Linux上是正确的。但是对于Windows,情况有所不同-libuv将I / O回调推迟到下一轮。您可以从source code推断出这一点。
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上尝试demo program并比较结果。
为什么行为不同?我不明白看起来像是设计选择,如果可以,为什么?
(此问题最初发布为here。很长时间没有得到任何回复,我决定重新发布。)