Node.js(libuv)如何在单个线程中执行所有操作

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) 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)

现在,有人能告诉我主线程如何以交替的方式运行这三个操作(触发新的网络操作、对现有网络操作进行 epoll,运行已完成 I/O 的回调)吗?(例如,上述 6 个操作的示例序列是什么?)

你一定要查看uvbook:http://nikhilm.github.io/uvbook/index.html - micnic
这里描述了libuv循环内部的工作原理:http://docs.libuv.org/en/v1.x/design.html#the-i-o-loop - saghul
2个回答

2

Node.js和libuv并非在主线程上执行每个操作。这是一个误解。

对于异步网络,libuv使用操作系统提供的设施(每个操作系统都不同),对于异步文件系统操作,它使用阻塞操作,并安排在线程池中执行。请参考这些文档获取更多详细信息。

就Node.js而言,它在幕后使用线程池"这是您不需要关心的实现细节"。


-1

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

这些在内核级别下是异步的,也就是说,只有一个阻塞函数负责分发整个事件循环的所有事件。

在node.js中,你没有这个“阻塞调用”,它只是在文件末尾被调用,例如,如果你使用node file.js调用文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接