【问题标题】:How to execute functions in parallel with async.js?如何与 async.js 并行执行函数?
【发布时间】:2014-03-11 18:28:20
【问题描述】:

在下面的代码中,我有Array.forEach,它依次执行doSomething同步函数:

items.forEach(function(item) {
doSomething(item);
});

我需要并行执行函数 (doSomething),使用 async.js 并尝试以下操作:

async.each(items, function (item, doneCallback) {
                        var startDate = new Date();
                        console.log(item.name().toString() + ' startDate: ' + startDate.toString() + ' - ' + startDate.getMilliseconds().toString());
                        doSomething(item); //Lazy function for many operations.
                        var endDate = new Date();
                        console.log(item.name().toString() + ' endDate' + endDate.toString() + ' - ' + endDate.getMilliseconds().toString());

                        return doneCallback(null);

                    }, function (err) {
                        otherFunction();
                        console.log('Finished');
                    });

但是函数doSomething是按顺序执行的。

我曾尝试使用async.parallel,但函数doSomething 再次按顺序执行:

items.forEach(function (item) {
                        var func = function (doneCallback) {
                            var startDate = new Date();
                            console.log(item.name().toString() + ' startDate: ' + startDate.toString() + ' - ' + startDate.getMilliseconds().toString());

                            doSomething(item); //Lazy function for many operations.

                            var endDate = new Date();
                            console.log(item.name().toString() + ' endDate' + endDate.toString() + ' - ' + endDate.getMilliseconds().toString());

                            return doneCallback(null);
                        };
                        functions.push(func);
                    });

                    async.parallel(functions, function (err, results) {
                        otherFunction();
                        console.log('Finished');
                    });

如何与async.js并行执行doSomething同步函数?

请帮帮我。

【问题讨论】:

    标签: javascript async.js


    【解决方案1】:

    如何与async.js并行执行doSomething同步函数?

    你不能。 async.js 仅用于异步任务,因此得名(另请参阅 this answer 关于同步行为)。此外,JavaScript 不能并行执行代码,因为它的事件、单线程范式;它只能并行“等待”下一个事件。

    如果您的同步执行确实有问题,请尝试将数组拆分为更小的块,并通过超时来延迟它们以实现非阻塞行为(请参阅JavaScript Performance Long Running Tasks、How to stop intense Javascript loop from freezing the browser、How to make non-blocking javascript code?、Best way to iterate over an array without blocking the UI),或者考虑使用 WebWorkers 进行非常繁重的计算。那么你可以使用 async.js 来管理这些。

    【讨论】:

    【解决方案2】:

    不幸的是,Javascript 是一种单线程语言。然而,HTML5 旨在通过添加Web Workers 来改进这一点,它允许生成真正的操作系统级线程。如果您能够利用 HTML5,那么这可能对您有用。您可以为每个项目生成一个 Web Worker,然后等待所有线程完成(加入)。

    【讨论】:

      【解决方案3】:

      如果您可以将 doSomething 重构为异步函数,则可以使用 async.parallel 函数开始运行这两个函数并等待它们都调用它们的回调。

      【讨论】:

        【解决方案4】:

        您只能按顺序运行这些函数(也许这是您需要的),为此使用eachSeries 函数而不是each。这是eachSeries 的简短文档:

        与 each 相同,仅将迭代器应用于 串联排列。下一个迭代器只调用一次当前的迭代器 已完成处理。这意味着迭代器函数将 按顺序完成。

        表达式synchronous function in parallel - 实际上没有意义。并行意味着异步执行。

        【讨论】:

          猜你喜欢
          • 2013-06-12
          • 1970-01-01
          • 1970-01-01
          • 2015-09-07
          • 1970-01-01
          • 1970-01-01
          • 2021-03-04
          • 2013-10-02
          • 1970-01-01
          相关资源
          最近更新 更多