我知道该节点依赖于单个事件线程。因此,它没有并行线程的方法。但是async.parallel确实提供了类似并行的功能。关于Stack的另一个问题意味着async.parallel正在使用process.nextTick。那么从本质上讲async.parallel只是一个并发函数,而不是真正的并行函数吗?
最佳答案
async.parallel
仅允许您启动多个异步操作,然后跟踪它们何时完成。它们实际并行运行多少,完全取决于异步操作是什么。如果它们是网络操作,那么它们很可能是完全并行的,因为所涉及的CPU很少,并且用于处理将数据传入和传出Node.js进程的CPU将在node.js单线程之外处理。 。
您自己的用于处理请求结果的代码并非真正并行运行。如您所知,node.js是单线程的,因此您一次执行的Java脚本绝不会超过一个。但是,诸如network操作和磁盘操作之类的许多操作都是由单个Javascript线程之外的node.js处理的,因此可以并行完成工作。
例如,如果要将诸如Java数学计算之类的一系列同步函数传递给async.parallel
,则并行执行任何操作。它将运行一个直到完成,然后运行下一个,依此类推,因为一次只能运行一个Javascript。async.parallel
将在与基于承诺的设计中使用Promise.all()
的情况相同。它通过多个异步操作来跟踪完成(或第一个错误)。
node.js中同步操作的真正并行性通常是通过群集(多个相同的node.js进程共享负载)或自定义子进程(启动自定义子进程以运行某些特定操作)完成的,然后操作系统可以应用多个CPU到不同的过程并实现一些实际的并行性。
我知道该节点依赖于单个事件线程。因此,它没有并行线程的方法。
在一个单个的node.js进程中,并且仅运行Javascript代码(无本地代码),这是正确的。当从以本机代码实现的Javascript调用函数时,node.js可能在内部使用线程或其他进程。
关于Stack的另一个问题意味着async.parallel正在使用process.nextTick。
如果异步管理代码(使用异步和异步操作混合在一起),则通常使用process.nextTick()
强制始终以异步方式调用回调以产生可预测的行为,这是常见的。出于同样的原因,Promise规范要求始终在将来的某个滴答中调用.then()
,即使立即解决了承诺,也永远不要同步调用它。
那么从本质上讲async.parallel只是一个并发函数,而不是真正的并行函数吗?async.parallel
的重点是跟踪多个异步操作的完成。它本身不会使任何事物异步。您传递给async.parallel
的操作本身将是它本身的任何内容(同步或异步)。异步库不会改变这一点。
关于node.js - Node.js async.parallel,它是并行的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46397370/