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

时间:2015-03-10 12:23:32

标签: node.js asynchronous event-driven 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的运行回调)

在INTERLEAVED FASHION中?(就像上面6个操作的示例序列一样)

2 个答案:

答案 0 :(得分:2)

Node.js和libuv不执行主线程上的每个操作。这是一种误解。

对于异步网络,libuv使用您的操作系统的工具(在每个操作系统上都是不同的),对于异步文件系统操作,它使用它安排在线程池上执行的阻塞操作。请查看at these docs了解更多详情。

就node.js而言,它使用“”下的线程池是一个你不关心的实现细节

答案 1 :(得分:-1)

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

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

在node.js中你没有这个'阻塞调用',如果你用节点file.js调用文件,它就会在文件的末尾调用。