在事件驱动的异步编程(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个操作的示例序列一样)
答案 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调用文件,它就会在文件的末尾调用。