【问题标题】:In Node.js, is writing to a TCP connection blocking?在 Node.js 中,写入 TCP 连接是否阻塞?
【发布时间】:2023-01-27 00:47:01
【问题描述】:

我有一个 node.js 进程,它有几个入口点,包括一个 tcp 服务器、websocket 服务器和命名管道服务器。我想知道与这些连接的任何交互是否会被阻止。

示例:对于给定的连接,如果由于客户端尚未发送任何内容而缓冲区中没有任何内容,这是否会阻止所有其他代码在 Node.js 进程中运行,直到客户端发送数据?

我的理解是节点会将像这样的 I/O 操作卸载到系统内核,因此它不会占用调用堆栈。

很可能我在这里弄错了,所以请告诉我!谢谢你。

【问题讨论】:

    标签: node.js websocket tcp io


    【解决方案1】:

    这是一个非常有趣的问题!

    我建议您首先了解什么是事件循环(阅读https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/),然后了解阻塞和非阻塞调用之间的区别(阅读https://nodejs.org/en/docs/guides/blocking-vs-non-blocking/)。

    现在我们将更多地了解节点如何在幕后工作,什么是阻塞和非阻塞操作,因此我们有能力了解和发现什么会阻塞或不会阻塞我们的循环。

    TCP连接会阻止它吗?那里可能有一个模块,它实际上取决于每个案例、库、实现。

    关于“本机”实现上的 TCP,如果您使用的是 node.js Net module,您会发现它是:

    [that] 模块提供异步网络 API,用于创建基于流的 TCP 或 IPC 服务器

    因此,原则上,它将是非阻塞的。

    例如,如果我们查看 socket.write documentation 本身,我们会发现这个函数:

    如果整个数据已成功刷新到内核缓冲区,则返回 true。如果全部或部分数据在用户内存中排队,则返回 false。当缓冲区再次空闲时将发出“drain”。

    因此它不应该阻止。

    PS:关于这个主题的另一篇有趣的文章是https://medium.com/@hnasr/when-nodejs-i-o-blocks-327f8a36fbd4

    祝您阅读愉快,并留意阻止函数调用!

    【讨论】:

    • 感谢您的周到回复
    猜你喜欢
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多