nodejs(libuv) 如何在一个线程中执行所有操作



在事件驱动的异步编程(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 操作、用于现有 N/W 操作的 epoll、对已完成的 I/O 运行回调)

交错时尚 ?(就像上述 6 个操作的示例序列一样)

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

对于异步网络,libuv 使用操作系统的功能(每个操作系统都不同),对于异步文件系统操作,它使用计划在线程池上执行的阻塞操作。有关更多详细信息,请查看这些文档。

就node.js而言,它在引擎盖下使用线程池的事实"是一个你不关心的实现细节"。

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

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

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

最新更新