在事件驱动的异步编程(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它只是在文件末尾调用。