【问题标题】:How to create concurrent functions call using bluebird promises?如何使用蓝鸟承诺创建并发函数调用?
【发布时间】:2017-01-25 09:53:07
【问题描述】:

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

【问题讨论】:

    标签: node.js asynchronous concurrency promise bluebird


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回答!但是我怎样才能将工作从主进程发送到另一个分叉/工人?或者我应该把我的工作函数放在 http-requests 后面?
    • @mikatakana - 有很多方法可以进行进程间通信,也有很多不同的方法来设计作业队列。当您启动子进程时,您会收到来自子进程的标准输入和标准输出流。您可以使用它,也可以让您的孩子在准备好进行另一项工作时通过 http 在已知端口上向您请求新工作。或者,可能有一百种其他设计。
    • @mikatakana - 这回答了你的问题吗?
    猜你喜欢
    • 2015-04-13
    • 2015-09-06
    • 1970-01-01
    • 2018-10-23
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    • 1970-01-01
    相关资源
    最近更新 更多