如何使用bluebird promises创建并发函数调用?

时间:2017-01-25 09:53:08

标签: node.js asynchronous concurrency promise bluebird

我需要组织函数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中,但这个提示也不起作用。

1 个答案:

答案 0 :(得分:1)

Promise不会进行同步操作并使它们成为可以并行运行的操作。这不是他们所做的,也不是他们能做的。相反,promises用于管理或协调已经能够在其他Javascript执行时在后台运行的操作。像这样的事情将是异步文件I / O,网络操作,计时器等......

node.js中的Javascript是单线程的。除非您启动其他进程或调用某些通过本机代码使用线程/进程的加载项,否则您无法在node.js中同时运行两个同步操作。它根本就不是为此而设计的。

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