在Node域中创建同步网络i / o

时间:2016-01-11 06:33:18

标签: node.js sockets http networking io

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);
    }
}

我已经确认这很有效。套接字连接在处理下一条消息之前等待响应。如果套接字是忙碌的"我们只是在队列上推送一条新消息。所以它是一个消息队列。

只是想知道我们可以使用更低级别的东西。我对此表示怀疑。

1 个答案:

答案 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>轮询将无限期阻止。

  
      
  1. 计算轮询超时。在阻塞I / O之前,循环计算它应该阻塞多长时间。这些是计算超时时的规则:

         
        
    • 如果循环使用UV_RUN_NOWAIT标志运行,则超时为0。
    •   
    • 如果要停止循环(调用uv_stop()),则超时为0.
    •   
    • 如果没有活动句柄或请求,则超时为0。
    •   
    • 如果有任何空闲句柄处于活动状态,则超时为0。
    •   
    • 如果有待处理的句柄待处理,则超时为0。
    •   
    • 如果上述情况均未匹配,则会采用最接近计时器的超时,或者如果没有活动计时器,则无穷大
    •   
  2.   
  3. I / O的循环块。此时,循环将阻止I / O执行上一步计算的超时。监视给定文件描述符以进行读取或写入操作的所有I / O相关句柄都会在此时调用它们的回调。

  4.   

所以不,没有Node.js库可以保证同步网络I / O.但是,有可能编写一个小的,可能无用的Node.js应用程序,可以无限期地有效地轮询非阻塞套接字。希望这会有所帮助。

相关问题