何时使用async nodejs?

时间:2017-01-10 00:33:13

标签: javascript node.js asynchronous concurrency es6-promise

我不是说ES7的异步,而是一般的异步函数,如回调和promisses。

所以,我研究过NodeJS和事件循环。一切都让我相信NodeJS有一种错误的异步感。

据我所知,只有当函数必须通过外部介质传递时才能正常工作。例如,执行读取文件(将由OS API使用),或者也将使用外部API的请求。

我发现很少有人谈论它,我想在这里与你讨论。 我的问题是: 这个想法我是对的吗?如果有实际的方法可以找出异步工作在哪里以及它在哪里付费?在某些情况下,如果我是正确的,异步只会花费更多的内存。

2 个答案:

答案 0 :(得分:2)

Node.js总是异步工作。如果您正在执行某些阻塞I / O(例如使用例如.fs.readFileSync()或其他同步函数),则完整的node.js运行时进程会在该调用期间停止处理任何其他内容。因此,在Web请求处理中,您从不调用同步函数(它只能在node.js命令行应用程序和应用程序启动期间接受等)

这只是node.js的一个基本功能;其结果是node.js / JavaScript没有并且不需要synchronized线程同步功能,例如。 Java的。

从技术上讲,运行node.js进程的唯一多线程是内部libuv库,只是为了弥补主机系统缺少的异步I / O.

如果您的处理未被I / O事件触发,则可以使用nodes.js timers创建人工事件。您是正确的假设一般来说,这会使nodes.js不方便或完全不适合CPU绑定处理。

答案 1 :(得分:1)

完全这只能在函数必须通过外部介质传递时才能正常工作。这是单线程异步事件循环的权衡。您应该避免在node.js中进行任何CPU绑定计算,因为它会阻止事件循环,以便不响应任何回调。

节点仅在OS IO调用时产生,在使用回调或promise时不会产生。这是处理基于IO的调用的两种方法,但它们本身并不是异步的。 (我见过很多项目,人们为同步代码创建基于回调的API :()