【发布时间】:2014-05-04 11:45:59
【问题描述】:
我有一个基于 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”作为第一个参数传递,以调用操作系统的睡眠命令并等待 10 秒。它不会阻塞整个节点进程,即发送到另一个请求处理程序的任何其他请求都不会被“doIt”处理程序阻塞 10 秒。但是,如果立即向服务器发送另一个请求并且应该由同一个“doIt”处理程序处理,它是否必须等到前一个“doIt”请求结束?
如果我使用 sleep(10) 函数调用(已注释掉)来替换“sleep 10”,我发现它会阻止其他请求直到 10 秒后。谁能解释一下为什么会有差异?
非常感谢!
-- 根据请求更新--
一条评论说,这个问题似乎与另一个问题 (How to promisify Node's child_process.exec and child_process.execFile functions with Bluebird?) 重复,后者是在这个问题一年后提出的。嗯,这些问题太不同了——一般来说,这是针对特定错误案例的异步问题提出的,而那个问题是在询问 Promise 对象本身。意图和用例都各不相同。
(如果有任何机会这些相似,不应该将新的标记为与旧的重复吗?)
【问题讨论】:
-
天哪,你能看看发布问题时的时间戳吗?这是在一年前提出的。
-
我不认为哪个问题有更多的流量(由统计数据得出结论 - 投票、观点等)重要,因此更有可能在网络搜索中找到。想想人:)
-
好吧,这是有道理的。你介意告诉我最常见的部分吗?我已经很久没有访问这个问题了,它们看起来完全不同。如果它们确实不同,也许我可以更好地澄清。
标签: javascript node.js asynchronous child-process