Javascript 使用阻塞长同步操作将暂停Node.js中的所有用户?

Javascript 使用阻塞长同步操作将暂停Node.js中的所有用户?,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,如果我的SMTP服务器(如)或web服务器(如)使用Node.js,并且我必须使用无法转换为异步的同步功能,会发生什么 如果我必须以同步方式发出HTTP请求,服务器将挂起给所有用户,直到HTTP请求完成,还是只挂起给当前用户/电子邮件?是否会暂停所有用户的处理?据我所知,同步请求不会阻止所有用户,但在我这样做之前,如果我不能绝对确定,我会进行一些测试。使用或其他库,可以发送同步请求,这确实是次优的,但是如果开发人员没有使用所有源代码的权利/可能性,那么这可能是一个必要的缺点 如果这是在客户端完成

如果我的SMTP服务器(如)或web服务器(如)使用Node.js,并且我必须使用无法转换为异步的同步功能,会发生什么


如果我必须以同步方式发出HTTP请求,服务器将挂起给所有用户,直到HTTP请求完成,还是只挂起给当前用户/电子邮件?是否会暂停所有用户的处理?

据我所知,同步请求不会阻止所有用户,但在我这样做之前,如果我不能绝对确定,我会进行一些测试。使用或其他库,可以发送同步请求,这确实是次优的,但是如果开发人员没有使用所有源代码的权利/可能性,那么这可能是一个必要的缺点

如果这是在客户端完成的(不是这种情况,但让我们澄清一下),那么来自浏览器的同步请求如下所示:

funcion Foo(){
   var request = new XMLHttpRequest();
   request.open("GET", "http://server.com", false);
   request.send();
   function handleResponse(response) {
      console.log(response);
   }
   handleResponse(request.responseText);
}

要理解问题的答案,您确实需要理解node.js。我强烈建议访问该SO链接,并遵循其中的一些链接

如果必须执行同步操作,请注意,同步调用将阻止进程上的所有其他请求。如果您希望同时为多个客户机/远程服务器提供服务,那么您肯定希望使用baked-into-node.js生成并发进程


此外,如果同步操作的速度慢到足以影响QoS,然后,熟悉
进程。nextTick
并防止进程在等待同步操作完成时完全停止将是一个非常明智的想法。

同步函数究竟做了哪些需要阻止的事情?@mscdex我不得不回答这个问题。有更好的主意吗?:)除非您使用的是节点群集,否则所有其他请求(针对所有用户)都将被阻止,直到同步功能完成。@RicardoPolo节点中的网络I/O从不被阻止,因此您链接到的问题/答案不适用(而是仅适用于浏览器)。@mscdex但如果您使用它,则会锁定。。。不是吗?阅读其中一个答案时,它说“当从事件队列检索到阻止I/O的事件时,Node.js从线程池检索到一个线程,并在那里而不是在主事件循环线程上执行该函数。这可以防止阻塞I/O阻塞事件队列“”中的其余事件。在这里,我理解它不会阻塞,因为它使用其他线程。我理解错了吗?谢谢或许他的答案是错的。在所有其他链接中,它表示只有一个线程,我们返回到该事件循环。在您引用的例子中,节点正在执行一些磁盘/网络I/O,默认情况下,请求是异步发出的,除非它调用名称中带有“sync”一词的函数。一种想法是,“节点启动请求,然后在返回结果之前不对其执行任何其他操作。即,它继续处理事件循环上的所有其他任务。稍后,当结果到达时,该函数被放回事件循环并继续处理。FWIW线程池根本不用于网络I/O。线程池仅用于异步文件I/O、dns.lookup()和其他一些事情。此外,在工作人员同时执行http请求处理和同步任务的情况下使用集群是不理想的。如果您真的有阻塞/CPU密集型的东西,那么最好有
n
子进程(其中
n
取决于您的需求/用例),基本上将工作项从队列中拉出来,并在完成每个工作项时通知主进程。