我有一台基于node.js构建的服务器。以下是请求处理程序功能之一:
var exec = require("child_process").exec
function doIt(response) {
//some trivial and fast code - can be ignored
exec(
"sleep 10", //run OS' sleep command, sleep for 10 seconds
//sleeping(10), //commented out. run a local function, defined below.
function(error, stdout, stderr) {
response.writeHead(200, {"Content-Type": "text/plain"});
response.write(stdout);
response.end();
});
//some trivial and fast code - can be ignored
}
同时,在同一个模块文件中,定义了一个本地功能“ sleeping”,其名称表明它将休眠10秒钟。
function sleeping(sec) {
var begin = new Date().getTime();
while (new Date().getTime() < begin + sec*1000); //just loop till timeup.
}
这是三个问题-
众所周知,node.js是单处理的,异步的,事件驱动的。是否所有带有回调参数的函数都是异步的?例如,如果我有一个函数my_func(callback_func),它将另一个函数作为参数。对callback_func或使my_func异步的某处是否有任何限制?
因此,至少child_process.exec与异步匿名回调函数作为参数是异步的。在这里,我将“ sleep 10”作为第一个参数传递,以调用操作系统的sleep命令并等待10秒。它不会阻止整个节点进程,即,发送到另一个请求处理程序的任何其他请求都不会被“ doIt”处理程序阻止长达10秒。但是,如果立即将另一个请求发送到服务器,并且应该由相同的“ doIt”处理程序处理,它是否必须等待直到上一个“ doIt”请求结束?
如果我使用sleeping(10)函数调用(已注释掉)替换“ sleep 10”,我发现它确实会阻止其他请求,直到10秒后。谁能解释为什么会有所不同?
谢谢一群!
-根据要求更新-
有一条评论说,这个问题似乎在另一个问题之后重复了一年(如何使用Bluebird来实现Node的child_process.exec和child_process.execFile函数的功能?)。这些问题太过不同了-一般都要求异步操作一个特定的错误案例,而那个问题本身就是关于Promise对象的。目的和用例都不同。
(如果有任何相似之处,难道不是新的标记为与旧的重复吗?)
1)否。例如.forEach
是同步的:
var lst = [1,2,3];
console.log("start")
lst.forEach(function(el) {
console.log(el);
});
console.log("end")
函数是否异步,仅取决于实现方式-没有限制。您不可能先验地知道它(您必须对其进行测试或知道其实现方式,或者阅读并相信文档)。还有更多功能,取决于参数,该功能可以是异步或同步的,也可以是两者兼有的。
2)不。每个请求都将产生一个单独的“睡眠”过程。
3)这是因为您的sleeping
功能完全混乱-它根本没有睡眠。它的作用是使用无限循环并检查日期(因此使用100%的CPU)。由于node.js是单线程的,因此它只是阻塞了整个服务器-因为它是同步的。这是错误的,请不要这样做。使用setTimeout
代替。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句