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

如果我有使用Node.js的SMTP服务器(如haraka )或Web服务器(如Express ),我必须使用无法转换为asynchronous的同步function会发生什么?

如果我必须以同步的方式创build一个HTTP请求,那么服务器将被挂起到所有的用户,直到http请求完成,或者只能挂起到当前的用户/电子邮件? 所有用户的处理是否会暂停?

要理解你的问题的答案,你真的需要了解node.js 事件循环 。 我强烈build议访问该SO链接,并遵循其中的一些链接。

如果您必须执行同步操作,请注意 ,同步呼叫将阻止进程中的所有其他请求。 如果你想让多个客户端/远程服务器同时服务,那么你一定要使用烘焙到node.js中的集群模块产生并发进程。

另外,如果你的同步操作足够慢,以至于影响你的QoS,那么熟悉process.nextTick并且防止你的进程在等待同步操作完成时被完全阻塞是一个非常聪明的想法。

据我所知,同步请求并没有阻止所有的用户,但是在我做这样的事情之前,如果我不确定,我会进行一些testing。 使用期货或其他库,可以发送同步请求,这确实是次优的,但是如果开发人员没有权利/可能性来处理所有的源代码,那么这可能是一个必要的罪恶。

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

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