3

在事件驱动的异步编程(nodejs<- libuv)中,我们有主线程执行所有操作。

这里每个操作都有 i) 主操作和 ii) 回调操作。

这意味着主线程正在执行所有主要操作和回调操作。

例如,

int main() {
   while(1) {
      asyncall(op1, callback1);
      asynccall(op2, callback2);
      asynccall(op3, callback3);
      asyncall(op4, callback1);
      asynccall(op5, callback2);
      asynccall(op6, callback3);
   }
}

假设所有 op-i 都是网络 i/o,因此它们将由主线程(使用轮询)执行,而不是使用一些工作线程池。

现在,主线程必须做:

i) Fire new network operation op-i
ii) Check if(epoll for Linux) IO op-j completed :
        a) If completed then run callback-j
    Else:
        b) jump to (ii)

现在,有人可以告诉主线程如何运行这些

三个操作(触发新的 n/w 操作,epoll 用于现有的 n/w 操作,运行回调以完成 I/O)

在 INTERLEAVED FASHION 中?(例如上述 6 次操作的示例序列)

4

2 回答 2

2

Node.js 和 libuv 不会在主线程上执行所有操作。这是一种误解。

对于异步网络,libuv 使用操作系统的设施(在每个操作系统上都不同),对于异步文件系统操作,它使用调度在线程池上执行的阻塞操作。查看这些文档以获取更多详细信息。

就 node.js 而言,它在后台使用线程池这一事实“是您不关心的实现细节”。

于 2015-05-27T19:33:52.170 回答
-1

如果你谈论网络 IO,所有平台都有一些特定的完全异步的 API。Linux 有 epoll,bsd 有 kqueue,solaris 有事件端口,windows IOCP。

这些是异步到内核级别的,因为只有一个阻塞函数可以调度整个事件循环的所有事件。

在 node.js 中,您没有此“阻塞调用”,例如,如果您使用 node file.js 调用文件,它只会在文件末尾调用。

于 2015-05-28T12:33:47.627 回答