【问题标题】:When to use synchronous - blocking code in Node.js何时在 Node.js 中使用同步阻塞代码
【发布时间】:2021-08-18 09:04:45
【问题描述】:

我曾在采访中问过,是否有任何情况可能会迫使您在 node.js 服务器中使用阻塞代码?

我的回答是:我在任何项目中都不需要它,但我认为它可能在一些需要大量 CPU 处理的任务中很有用,例如图像处理或视频生成。

各位专家,您能帮我纠正一下吗,是否有任何情况下必须使用阻塞代码?

【问题讨论】:

  • @code - 这只是异步代码编写不当。如果您要使用异步 API,则必须编写适当的异步代码才能对事物进行适当的排序。

标签: node.js asynchronous async-await blocking synchronous


【解决方案1】:

首先,您必须区分不同类型的程序。您期望响应许多不同传入请求的服务器与您编写的用于执行某些文件管理或获取某些内容并将其插入数据库的单个用户程序的需求截然不同。

因此,如果您不是多用户服务器,则可以在任何提供同步 I/O 的地方使用它(尤其是用于文件访问)。例如,我有几个脚本在我的硬盘上进行文件管理。这些脚本没有任何服务器组件,并在半夜自动运行以修剪备份、修剪日志文件等……这些脚本完全可以使用同步 I/O 处理几乎所有事情。

另一方面,如果您是多用户服务器,并且您需要响应随时可能到达的传入请求,那么您可以/应该使用阻塞 I/O 或阻塞加密的唯一两次在启动时或在某种关闭情况​​下。对于为传入请求提供服务的所有其他代码,您必须使用非阻塞、异步 I/O 以避免在请求期间锁定服务器并使其无法响应新的传入请求。

如果您有耗时的 CPU 密集型操作,例如图像处理或视频生成,那么您需要将该处理卸载到另一个线程或进程,以便您的主服务器线程不会被阻止执行该处理。一种典型的处理方式是创建一个由 N 个进程/线程组成的工作池,可以将这些工作发送到 crunch 上。然后,您将最占用 CPU 的工作保持在主 nodejs 线程之外,使其能够保持对传入请求的响应。

各位专家,您能帮我纠正一下吗,是否有任何情况下必须使用阻塞代码?

同步(阻塞)I/O 极大地简化了服务器启动,因为您可以同步读取配置等操作。您可以异步编写该代码,但是您的模块接口通常最终不得不返回指示它何时真正准备好并完成初始化的承诺,这使得使用模块变得复杂。

例如,require() 是同步的,这确实非常有助于简化初始化。

我所知道的服务器中唯一可能需要阻塞代码的地方是,如果您正试图在程序退出之前将某些内容写入磁盘,而该程序已经在退出过程中。您会收到退出事件的通知,如果您尝试使用异步文件 I/O,那么您的程序将在 I/O 完成之前退出。在这种情况下,您可能需要使用同步文件 I/O(在这种情况下这不是问题)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2011-08-05
    • 1970-01-01
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多