了解libuv/epoll/非阻塞网络IO

use*_*955 5 c io networking node.js libuv

我试图了解非阻塞网络 IO 在Node.js/中如何工作libuv。我已经发现文件IO 是使用libuv工作线程完成的(因此,在后台线程中)。然而,在很多地方都指出网络epollIO 是使用诸如、等系统调用以非阻塞方式完成的kqueue(取决于操作系统)。

现在我想知道这是否意味着实际的 IO 部分 ( read())仍然在主线程上完成,从而阻塞,即使epoll使用了eg?据我了解,epoll仅通知可用事件,但实际上并不执行读/写操作。至少在我发现的示例中(例如http://davmac.org/davpage/linux/async-io.htmlepoll总是与系统调用结合使用read,这是一个阻塞IO操作。

换句话说,如果libuv使用单线程并且epoll在数据可供读取时收到通知,那么接下来的读取操作是否正在主线程上执行,从而可能阻塞主线程上的其他操作(考虑网络请求)?

Max*_*kin 3

引用文件的文件描述符始终被报告为可供读/写epoll/poll/select,但是,read/write可能会阻塞等待数据读/写。这就是为什么文件 I/O 必须在单独的线程中完成的原因。

而管道和套接字的非阻塞send/recv是真正的非阻塞,因此可以在 I/O 线程中完成,而不会有阻塞线程的风险。