Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
何时在Node.js中使用同步阻塞代码_Node.js_Asynchronous_Async Await_Blocking_Synchronous - Fatal编程技术网

何时在Node.js中使用同步阻塞代码

何时在Node.js中使用同步阻塞代码,node.js,asynchronous,async-await,blocking,synchronous,Node.js,Asynchronous,Async Await,Blocking,Synchronous,我在一次采访中问过,是否有任何情况会迫使您在node.js服务器中使用阻止代码? 我的回答是:我在任何项目中都不需要它,但我认为它在一些需要大量CPU处理的任务中可能很有用,比如一些图像处理或视频生成 所以专家们,你能帮我纠正一下吗,有没有任何情况下必须使用阻塞代码?首先,你必须区分不同类型的程序。您希望对许多不同的传入请求做出响应的服务器与您编写的用于执行某些文件管理或获取某些内容并将其插入数据库的单用户程序有着非常不同的需求 因此,如果您不是一个多用户服务器,那么您可能可以在提供同步I/O的

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

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


所以专家们,你能帮我纠正一下吗,有没有任何情况下必须使用阻塞代码?

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

因此,如果您不是一个多用户服务器,那么您可能可以在提供同步I/O的任何地方使用它(最特别是用于文件访问)。例如,我有几个脚本在我的硬盘上进行文件管理。这些脚本不具有任何服务器组件,并且在午夜自动运行以修剪备份、修剪日志文件等。这些脚本完全可以对几乎任何事情使用同步I/O

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

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

所以,专家们,你们能帮我纠正一下吗,有并没有任何情况下必须使用阻塞代码

同步(阻塞)I/O大大简化了服务器启动,因为您可以同步执行读取配置之类的操作。您可以异步编写代码,但是模块接口通常必须返回承诺,指示何时实际准备好并完成初始化,这会使模块的使用变得复杂

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


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

@code-这只是不正确编写的异步代码。如果要使用异步API,就必须编写适当的异步代码,以便对事情进行适当的排序。