多次并行调用相同的函数

时间:2018-04-16 09:08:29

标签: node.js promise bluebird

我试图平行地调用相同的功能,但有不同的争论。我使用了Promise.all,但似乎没有平行地执行任务。我尝试使用蓝鸟,但似乎执行只是顺序发生。 PFB代码和日志的片段。

let records = await getRecords(query);
    if (_.size(records) > 0) {
       bluebird.map(records, function (record) {
            return prepareFileContent(record.MESSAGE_PAYLOAD);
        }, { concurrency: records.length }).then(function (data) {
            finalData = data;
            console.log("done");
        });            
    }


 export async function prepareFileContent(payload : string) : Promise<string>{
return new Promise<string>(function(resolve,reject){
    try{
        console.log("content generation starts");
        //logic goes here
        console.log("content generation ends");
       resolve(details);          
   }
    catch(err)
    {
        log.error("Error in parsing the payload:", err);
        reject(err);
    }
});`

日志看起来像这样,表明它们是按顺序而不是并行执行的。 (从这时起,每个人执行需要4秒钟)

2018-04-16T08:47:53.095Z    content generation starts
2018-04-16T08:47:57.819Z    content generation ends
2018-04-16T08:47:57.820Z    content generation starts
2018-04-16T08:48:02.253Z    content generation ends
2018-04-16T08:48:02.254Z    content generation starts
2018-04-16T08:48:06.718Z    content generation ends
2018-04-16T08:48:06.718Z    content generation starts
2018-04-16T08:48:11.163Z    content generation ends
2018-04-16T08:48:11.163Z    content generation starts
2018-04-16T08:48:15.573Z    content generation ends
2018-04-16T08:48:15.574Z    content generation starts

有人可以帮我解决如何实现同样的问题以及我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

首先,node.js Javascript是单线程的。因此,没有两个Javascript真正并行运行。当人们谈到并行运行的事情时,这只适用于具有本机代码组件的异步操作,例如网络操作,文件操作等......

您似乎在假设像Bluebird的Promise.map()这样的承诺和功能启用并行操作的情况下运行。只有当您使用promises(在您的示例中使用prepareFileContent()函数)监视的基础操作实际上能够在Javascript解释器之外自行运行时,才会出现这种情况。但是,您向我们展示的函数prepareFileContent()中的代码只是Javascript,因此它无法与其他任何内容并行运行。请记住,node.js运行您的Javascript单线程,因此它无法同时运行两个Javascript。

因此,您的输出完全符合预期。 bluebird.map()遍历数组,在数组中的每个项目上调用回调并从每个函数调用中收集一个promise。然后,它等待所有承诺完成并将所有已解析的结果收集到一个数组中。

但是,每个回调都是同步的。他们没有任何异步部分,因此所有代码最终都会同步运行。没有什么是并行的。