【问题标题】:Creating synchronous network i/o in Node land在 Node Land 中创建同步网络 i/o
【发布时间】:2016-01-12 10:09:17
【问题描述】:

是否有任何用于 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);
    }
}

我已经确认这工作得很好..套接字连接在处理下一条消息之前等待响应。如果套接字“忙”,我们只需在队列中推送一条新消息。所以它是一个消息队列。

只是想知道我们是否可以使用任何更低级别的东西。我怀疑。

【问题讨论】:

    标签: node.js sockets http networking io


    【解决方案1】:

    Node.js 建立在 libuv 之上,libuv 轮询非阻塞网络套接字以获取活动。来自libuv design overview 文档(已添加重点):

    事件循环遵循相当常见的单线程异步 I/O 方法:所有(网络)I/O 都在非阻塞套接字上执行,这些套接字使用给定可用的最佳机制进行轮询平台:Linux 上的 epoll,OSX 和其他 BSD 上的 kqueue,SunOS 上的事件端口和 Windows 上的 IOCP。

    但是,如果一个 Node.js 应用程序只有一个 I/O 操作并且没有计时器,那么 投票将无限期阻塞

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

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

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

    【讨论】:

    • 谢谢,从您的回答中,我不清楚“无限期轮询”和“轮询直到响应准备好/完成”之间的区别,它们对我来说似乎是一样的
    猜你喜欢
    • 1970-01-01
    • 2018-08-08
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 2012-09-14
    • 2020-12-12
    • 1970-01-01
    相关资源
    最近更新 更多