【问题标题】:Run node.js functions in parallel并行运行 node.js 函数
【发布时间】:2021-10-31 06:39:29
【问题描述】:

我是 Node.js 的新手,我希望同时运行一些函数。 我看过几篇文章,据我了解,我可以使用Promise.allPromise.allSettled
我不明白为什么我的函数顺序运行,这是我安排的代码。

async processPropositions(proposition) {
        const dataWords = [];
        const start = Date.now()

        //async functions that return promises
        const invariableData = this.invariables(propositionSplitted);
        const nounsData = this.nouns(propositionSplitted);
        const adjectivesData = this.adjectives(propositionSplitted);
        const verbsData = this.verbs(propositionSplitted);

        //here the code should stop until every promise is resolved
        const [invariables, nouns, adjectives, verbs] = await Promise.all([invariableData, nounsData, adjectivesData, verbsData]);

        //I find this time == to the sum of the time printed in the single functions abo
        const finish = Date.now()
        const time = finish - start
        console.log(time)

        //here in the original function I append results to dataWords
        
        return dataWords;
    }

我打印了单个异步函数(即this.invariables(propositionSplitted);this.nouns(propositionSplitted);this.adjectives(propositionSplitted);this.verbs(propositionSplitted);)的时间,它们的总和等于我正在使用此函数打印的time

当我尝试使用 for 循环为数组 propositions 的每个 proposition 运行主函数时,我遇到了同样的问题。由于它们是独立的,我想同时运行它们,然后在每个承诺得到解决时收集结果。 我试过了,但显然我错过了异步编码的基本概念:

        for (let proposition of propositions) {
        results.push(this.processPropositions(proposition));
        for (let result of results) {
            dataWords.push(await result);
            if (propositions.length > 1 && results.indexOf(result) < conjunctions.length) dataWords.push(Conjunctions.getConjunction(conjunctions[results.indexOf(result)]));
        }
    }

如果我不await,for 循环会在它收到前提之前完成,而如果我保持await,它就会变成同步的。

【问题讨论】:

  • 因此,您所寻求的时间检查需要在您获得所有承诺之后进行。现在,您可以在 Promise 完成之前执行该时间检查。它们不会阻止执行,但利用承诺的解决方案将为您提供真正花费的时间。
  • 我想我没听懂你说的,但是我在整个过程结束时有另一个时间检查(第二个sn-p的功能),它太高了(几毫秒与processProposition()中的check不同:代码是同步执行的。
  • this.processPropositions 在做什么?它甚至做任何异步的事情吗?
  • @Bergi 谢谢。 processPropositions 只是调用不同的较小的独立函数并从中收集结果。由于它们是独立的,我希望它们同时运行,以提高性能。在链接中,我可以读到“在单独的子进程中运行它,并在完成后获得异步通知。”,我认为这实际上是在 processProposition 中发生的事情:正如你在我的第一段代码中看到的那样我正在调用使用 async 关键字声明的几个函数,所以它们应该是异步的,不是吗?

标签: node.js for-loop asynchronous async-await promise


【解决方案1】:

内部循环不等待承诺解决。像你在外循环中所做的那样加载所有的承诺,但在它们完成之前不要检查解决方案。然后你可以循环遍历结果。

function myPromise(duration) {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve(duration);
        }, duration);
    });
}

const propositions = [ 200, 500, 4000 ];
const promises = [];
for(const proposition of propositions) {
    promises.push(myPromise(proposition));
}
const start = Date.now();
Promise.all(promises).then(results => {
    const totalTime = Date.now() - start;
    console.log(`all timers finished in ${totalTime}`);
    results.forEach((t, i) => {
        console.log(`  timer ${i} took ${t}`);
    });
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 2019-12-30
    • 1970-01-01
    • 2012-12-11
    • 2012-03-18
    相关资源
    最近更新 更多