Node.js是否有任何阻塞network
I / O库?我们有文件系统I / O的同步工具,但我不确定Node.js中的网络I / O是否存在等价物。
我们可以像这样创建阻止网络操作:
var available = true;
var messages = [];
var socket = io('http://localhost:8080');
socket.on('RESPONSE_RECEIVED', function () {
available = true; //we can confirm receipt, so we are free to process next message
var msg = messages.shift();
if (msg) {
sendData(msg);
}
});
function sendData(data) {
if (available) {
available = false;
socket.emit('SEND_NEW_DATA', data);
} else {
messages.push(data);
}
}
我已经确认这很有效。套接字连接在处理下一条消息之前等待响应。如果套接字是忙碌的"我们只是在队列上推送一条新消息。所以它是一个消息队列。
只是想知道我们可以使用更低级别的东西。我对此表示怀疑。
答案 0 :(得分:2)
Node.js建立在libuv上,轮询非阻塞网络套接字以进行活动。从libuv design overview文件(强调添加):
事件循环遵循相当常见的单线程异步I / O方法:所有(网络)I / O在非阻塞套接字上执行,使用给定的最佳机制轮询平台:Linux上的epoll,OSX和其他BSD上的kqueue,SunOS上的事件端口和Windows上的IOCP。
但是,如果Node.js应用只有一个I / O操作且没有定时器,那么<strong>轮询将无限期阻止。
计算轮询超时。在阻塞I / O之前,循环计算它应该阻塞多长时间。这些是计算超时时的规则:
- 如果循环使用UV_RUN_NOWAIT标志运行,则超时为0。
- 如果要停止循环(调用uv_stop()),则超时为0.
- 如果没有活动句柄或请求,则超时为0。
- 如果有任何空闲句柄处于活动状态,则超时为0。
- 如果有待处理的句柄待处理,则超时为0。
- 如果上述情况均未匹配,则会采用最接近计时器的超时,或者如果没有活动计时器,则无穷大。
- 醇>
I / O的循环块。此时,循环将阻止I / O执行上一步计算的超时。监视给定文件描述符以进行读取或写入操作的所有I / O相关句柄都会在此时调用它们的回调。
所以不,没有Node.js库可以保证同步网络I / O.但是,有可能编写一个小的,可能无用的Node.js应用程序,可以无限期地有效地轮询非阻塞套接字。希望这会有所帮助。