在node.js中,如何使用child_process.exec这样一切都可以asynchronous发生?

我有一个build立在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”,正如它的名字所示,它将会hibernate10秒钟。

 function sleeping(sec) { var begin = new Date().getTime(); while (new Date().getTime() < begin + sec*1000); //just loop till timeup. } 

这里来了三个问题 –

  1. 我们知道,node.js是单处理的,asynchronous的,事件驱动的。 具有callback参数的所有函数是asynchronous的吗? 例如,如果我有一个函数my_func(callback_func),它将另一个函数作为参数。 callback_func是否有任何限制,或者使my_funcasynchronous?

  2. 所以至lesschild_process.exec与一个callback匿名函数作为参数是asynchronous的。 在这里,我通过“睡眠10”作为第一个参数,调用操作系统的睡眠命令,并等待10秒钟。 它不会阻塞整个节点进程,也就是说,发送到另一个请求处理程序的任何其他请求不会被“doIt”处理程序阻塞达10秒。 但是,如果立即向服务器发送另一个请求,并且应该由同一个“doIt”处理程序处理,是否必须等到先前的“doIt”请求结束?

  3. 如果我使用睡眠(10)函数调用(注释掉)来replace“睡眠10”,我发现它阻止了其他请求,直到10秒之后。 任何人都可以解释为什么区别?

谢谢一堆!

– 每个请求更新 –

一个评论说,这个问题似乎与另一个问题重复( 如何promisify节点的child_process.exec和child_process.exec文件function与蓝鸟? ),这是一年后,这一个问..这些太不同了 – 这是要求asynchronous一般与一个特定的越野车案件,而那个人问起Promise对象本身。 意图和使用情况各不相同。

(如果这些情况是相似的,是不是应该把新的标记与旧的标记重复?)

1)否。例如.forEach是同步的:

 var lst = [1,2,3]; console.log("start") lst.forEach(function(el) { console.log(el); }); console.log("end") 

无论函数是否是asynchronous的,它完全依赖于实现 – 没有限制。 你不可能先验地知道它(你必须testing它,或者知道它是如何实现的,或者是相信文档的)。 还有更多,取决于参数的函数可以是asynchronous或同步或两者兼而有之。

2)不需要。每个请求将产生一个单独的“睡眠”过程。

3)那是因为你的sleepingfunction是一团糟 – 根本不是睡眠。 它所做的是使用无限循环并检查date(因此使用100%的CPU)。 由于node.js是单线程的,因此它只是阻塞整个服务器 – 因为它是同步的。 这是错的,不要这样做。 改用setTimeout