在node.js中,如何使用child_process.exec以使所有操作都可以异步发生?

布鲁斯

我有一台基于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.
}

这是三个问题-

  1. 众所周知,node.js是单处理的,异步的,事件驱动的。是否所有带有回调参数的函数都是异步的?例如,如果我有一个函数my_func(callback_func),它将另一个函数作为参数。对callback_func或使my_func异步的某处是否有任何限制?

  2. 因此,至少child_process.exec与异步匿名回调函数作为参数是异步的。在这里,我将“ sleep 10”作为第一个参数传递,以调用操作系统的sleep命令并等待10秒。它不会阻止整个节点进程,即,发送到另一个请求处理程序的任何其他请求都不会被“ doIt”处理程序阻止长达10秒。但是,如果立即将另一个请求发送到服务器,并且应该由相同的“ doIt”处理程序处理,它是否必须等待直到上一个“ doIt”请求结束?

  3. 如果我使用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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在node.js中,如何使用child_process.exec以使所有操作都可以异步发生?

来自分类Dev

如何在node.js child_process exec命令中使用“&”?

来自分类Dev

Node.js child_process exec的标准输出被缩短

来自分类Dev

Node.js child_process exec的标准输出被缩短

来自分类Dev

我应该如何使用 child_process 模块在 linux 中通信 python 和 node.js?

来自分类Dev

使所有组件都可以使用 Angular 服务

来自分类Dev

如何模拟Node.js child_process生成函数?

来自分类Dev

无法从node.js中的child_process访问数组

来自分类Dev

Node js Google App Engine 中的 child_process

来自分类Dev

使用node.js child_process调用python脚本

来自分类Dev

使用node.js child_process调用python脚本

来自分类Dev

单例使用 - 如何让所有类都可以使用数据?

来自分类Dev

节点js中所有集群节点是否都可以使用“ COMMON”变量?

来自分类Dev

节点js中所有集群节点是否都可以使用“ COMMON”变量?

来自分类Dev

如何使所有员工角色都可以使用此功能?

来自分类Dev

Android:如何使所有活动都可以使用套接字连接

来自分类Dev

如何使用child_process.exec访问node.js子进程中的命令行参数?

来自分类Dev

在所有版本的excel中都可以使用的程序

来自分类Dev

在几乎所有地方都可以使用async / await吗?

来自分类Dev

除了一个元素之外的所有元素都可以使用addEventListener

来自分类Dev

在Unity支持的所有平台上都可以使用WWW吗?

来自分类Dev

除了一个元素之外的所有元素都可以使用addEventListener

来自分类Dev

Git Bash不适用于npm,node,ng命令,但是所有这些命令都可以在Powershell Windows 10中使用

来自分类Dev

如何构建docker以从Google App Engine中的Node.js child_process运行Python3?

来自分类Dev

是否可以使所有GUI linux应用程序都可以使用X服务器工作?

来自分类Dev

使用Impala访问Hbase表时,所有SQL操作都可以工作吗?

来自分类Dev

如何使Windows 10中的所有用户都可以使用桌面快捷方式

来自分类Dev

node.js如何使用child_process.exec显示标准输入

来自分类Dev

使所有Dask工人都可以使用该服务中所有导入的最佳方法是什么?

Related 相关文章

  1. 1

    在node.js中,如何使用child_process.exec以使所有操作都可以异步发生?

  2. 2

    如何在node.js child_process exec命令中使用“&”?

  3. 3

    Node.js child_process exec的标准输出被缩短

  4. 4

    Node.js child_process exec的标准输出被缩短

  5. 5

    我应该如何使用 child_process 模块在 linux 中通信 python 和 node.js?

  6. 6

    使所有组件都可以使用 Angular 服务

  7. 7

    如何模拟Node.js child_process生成函数?

  8. 8

    无法从node.js中的child_process访问数组

  9. 9

    Node js Google App Engine 中的 child_process

  10. 10

    使用node.js child_process调用python脚本

  11. 11

    使用node.js child_process调用python脚本

  12. 12

    单例使用 - 如何让所有类都可以使用数据?

  13. 13

    节点js中所有集群节点是否都可以使用“ COMMON”变量?

  14. 14

    节点js中所有集群节点是否都可以使用“ COMMON”变量?

  15. 15

    如何使所有员工角色都可以使用此功能?

  16. 16

    Android:如何使所有活动都可以使用套接字连接

  17. 17

    如何使用child_process.exec访问node.js子进程中的命令行参数?

  18. 18

    在所有版本的excel中都可以使用的程序

  19. 19

    在几乎所有地方都可以使用async / await吗?

  20. 20

    除了一个元素之外的所有元素都可以使用addEventListener

  21. 21

    在Unity支持的所有平台上都可以使用WWW吗?

  22. 22

    除了一个元素之外的所有元素都可以使用addEventListener

  23. 23

    Git Bash不适用于npm,node,ng命令,但是所有这些命令都可以在Powershell Windows 10中使用

  24. 24

    如何构建docker以从Google App Engine中的Node.js child_process运行Python3?

  25. 25

    是否可以使所有GUI linux应用程序都可以使用X服务器工作?

  26. 26

    使用Impala访问Hbase表时,所有SQL操作都可以工作吗?

  27. 27

    如何使Windows 10中的所有用户都可以使用桌面快捷方式

  28. 28

    node.js如何使用child_process.exec显示标准输入

  29. 29

    使所有Dask工人都可以使用该服务中所有导入的最佳方法是什么?

热门标签

归档