【发布时间】:2013-03-09 17:23:12
【问题描述】:
- 我了解到 node.js 在内部使用 libeio 在 *nix 平台上使用线程池执行异步 file I/O,对吗?
- 异步网络 I/O 怎么样?它是由libev完成的吗?还有线程池吗?
- 如果里面有线程池,怎么会比传统的一个请求一个线程的模型更高效呢?每个 I/O 请求一个线程吗?
- Windows 的机制是什么?我知道是 IOCP 做的,还有内核级别的线程池,对吧?
- 为什么linux还没有像windows IOCP这样原生的完全AIO机制?以后会有吗?
根据长昌的回答更新:
- 我在source code@changchang 给出的快速查看,发现默认线程池大小可以通过UV_THREADPOOL_SIZE 来重置,我想知道在什么情况下会使用这个?
- 我也发现getaddrinfo使用这个线程池,除了fs还有吗?如果所有同步作业都在这个线程池中完成,那么默认大小“4”是否足够?
- 据我现在的理解,node.js 进程中将有 6 个基本线程:1 个 V8 线程(事件循环,用户 javascript 代码运行的地方)、1 个 libuv 事件循环和 4 个线程池,对吗?
-
我怎样才能在我的 shell(Ubuntu)中看到这些线程?我使用 ps -eLf | grep 节点 | grep -v grep 只看到了两个:
root 16148 7492 16148 0 2 20:43 pts/26 00:00:00 ./bin/node /home/aaron/workspace/test.js
根 16148 7492 16149 0 2 20:43 pts/26 00:00:00 ./bin/node /home/aaron/workspace/test.js
【问题讨论】:
-
node.js 实际上使用libuv 为所有支持的平台抽象异步IO
-
@user568109 我已经读过,但无法从中得到直接的答案,实际上,不清楚的表达更让我困惑。它提到 libeio '异步执行输入输出'包括套接字,我对此表示怀疑。我从某个地方了解到这一点:因为不能在常规文件上使用 epoll,所以这里有 libeio 来使用线程执行 aio。
-
@simfoo 是的,我知道 libuv,我想知道它下面的机制,包括 *nix 和 windows。
标签: javascript linux node.js io libuv