如何使用蓝鸟承诺创建并发函数调用?

How to create concurrent functions call using bluebird promises?

我需要组织函数的并发竞争过程 Func1Func2 并在解析最快的函数时解析 main。

const Promise = require('bluebird')

const Func1 = require('./functions/func1')
const Func2 = require('./functions/func2')

let functions = [
    Func1(25),
    Func2(40)
]

Promise.any(functions).spread(response => {
    console.log(response)
})

两个函数看起来都像

const Promise = require('bluebird')

module.exports = function(data) {
    return new Promise((resolve, reject) => {
        let sum = 0

        // SOME SLOW OPERATION FOR TEST
        for (var i = 1; i <= 1000000000; i++) {
            sum += i * data
        }

        resolve(sum)
    })
}

但是使用此代码,功能 运行 同步。我希望他们在 Promise.any 部分并发处理。我应该如何重写我的代码来做到这一点?我试图在 process.nextTick 中包装函数,但这个提示也不起作用。

Promise 不会采用同步操作并将它们变成可以 运行 并行的操作。那不是他们所做的,也不是他们能做的。相反,promises 用于管理或协调操作,这些操作本身已经能够 运行 在后台执行,而其他 Javascript 正在执行。像这样的东西将是异步文件 I/O、网络操作、计时器等...

Javascript in node.js 是单线程的。除非你启动一些其他进程或通过本机代码调用一些使用 threads/processes 的 add-on,否则你根本无法 运行 在 node.js 中同时进行两个同步操作。它根本不是为了这样做而设计的。

在 node.js 中并发执行多个同步活动的通常方法是 运行 多个 node.js 进程。这样做时,每个 node.js 进程可以 运行 独立,可以使用多个 CPU 并可以真正并发执行不同的同步操作。这可以通过集群或某种工作队列来完成,一组 node.js 进程正在从中提取作业,或者可以通过启动其他进程以任意数量的自定义方式来完成。