【问题标题】:Stdout flush for NodeJS?NodeJS的标准输出刷新?
【发布时间】:2012-09-12 17:07:46
【问题描述】:

nodejs 是否有任何标准输出刷新,就像 python 或其他语言一样?

sys.stdout.write('some data')

sys.stdout.flush()

现在我只看到 process.stdout.write() 用于 nodejs。

【问题讨论】:

    标签: node.js


    【解决方案1】:

    write 返回 true 如果数据已被刷新。如果它返回false,你可以等待'drain'事件。

    我认为没有flush,因为那将是一个阻塞操作。

    【讨论】:

    • @Kiyura 几乎正确。 Stream.write 没有阻塞,但对于标准输出,它通常是:nodejs.org/api/process.html#process_process_stdout 谢谢,不知道。
    • 我明白了。老实说,我真的不知道任何一种方式,但我认为它至少必须阻塞到它写入内核缓冲区的程度。我想这还不够“阻塞”,无法根据 Node.js 计算。 :)
    【解决方案2】:

    process.stdout 是一个WritableStream 对象,WritableStream.write() 方法自动刷新流(除非它被显式阻塞)。但是,如果刷新成功,它将返回 true,如果内核缓冲区已满且无法写入,则返回 false。如果需要连续多次写入,应处理drain事件。

    the documentation for write

    【讨论】:

    • 文档说它返回true,只要数据被添加到缓冲区并且缓冲区中有一些空闲空间(缓冲区的总大小小于highWaterMark)。因此,这与刷新数据完全不同。数据甚至不在硬盘的缓存中,数据只是在程序的内存中。当callback 被触发时,数据会闪烁。 drain 事件只是表示缓冲区中出现了空闲空间。
    • 是的。自 2013 年底以来,此答案已被弃用。
    【解决方案3】:

    在较新的 NodeJS 版本中,您可以将回调传递给 .write(),一旦数据刷新就会调用该回调:

    sys.stdout.write('some data', () => {
      console.log('The data has been flushed');
    });
    

    这与检查.write()结果并注册到drain事件完全相同:

    let write = sys.stdout.write('some data');
    if (!write) {
      sys.stdout.once('drain', () => {
        console.log('The data has been flushed');
      });
    }
    

    【讨论】:

    • 我要补充一点,如果您是为了响应事件流而执行此操作,则此方法仅在您可以 pause() 如果 !write 然后 resume() 一旦 drain 触发时才能正常工作,否则不管怎样,你只会长出一个巨大的背压堆......
    • 对于节点 12,我改用 process.stdout.write
    【解决方案4】:

    还有另一个函数stdout 可以清除终端的最后输出,类似于flush

    function flush() {
        process.stdout.clearLine();
        process.stdout.cursorTo(0);
    }
    
    var total = 5000;
    var current = 0;
    var percent = 0;
    var waitingTime = 500;
    setInterval(function() {
        current += waitingTime;
        percent = Math.floor((current / total) * 100);
        flush();
        process.stdout.write(`downloading ... ${percent}%`);
        if (current >= total) {
            console.log("\nDone.");
            clearInterval(this);
        }
    }, waitingTime);
    

    cursorTo 会将光标移动到0 的位置,这是起点

    stdout.write之前使用flush函数,因为它会清除屏幕,如果你放在后面你将看不到任何输出

    【讨论】:

    • 这会清除并重新打印当前行。我认为“刷新”的意思是立即发送任何等待发送到标准输出的数据。如果一个程序很忙,你在标准输出中写了一些东西,它不会立即被发送,直到它有空闲时间。 write 将数据发送到程序空闲时刷新的缓冲区。
    • @BenJ,根据您的描述,即使 OP 有这个意图,也不清楚。而且,这个答案是我在寻找“冲洗”时所要寻找的;清除并在同一页上重写。所以得到了我的支持
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    • 2019-11-22
    • 1970-01-01
    • 2011-01-08
    • 2018-07-20
    相关资源
    最近更新 更多