如何在循环中等待多个WebWorkers

坦率

JS中的Web Workers存在以下问题。我有一个重型应用程序在做一些模拟。该代码在多个Web Worker中运行。主线程在WebPage上运行。但是,如果有道理的话,也可以是Web Worker。

例子:

    var myWebWorkers = [];
    function openWorker(workerCount){
        for(var i = 0; i < workerCount; i++){
            myWebWorkers[i] = new Worker('worker.js');
            myWebWorkers[i].onmessage = function(e){
                this.result = e.data;
                this.isReady = true;
            }
        }
    }

    function setWorkerData(somedata){
        // somedata.length is always a multiple of myWebWorkers.length
        var elementCntPerWorker = somedata.length / myWebWorkers.length;
        myWebWorkers.forEach(function(worker, index){
            worker.isReady = false;
            worker.postMessage(
                somedata.slice(index * elementCntPerWorker, 
                    (index + 1) * elementCntPerWorker - 1));
        });
    }

    var somedata = [...];
    openWorker(8); 
    for(var i = 0; i < 10000; i++){
         setWorkerData(somedata);
         waitUntilWorkersAreDoneButAllowBrowserToReact(myWebWorkers);
         if(x % 100) updateSVGonWebPage
    }

    function waitUntilWorkersAreDoneButAllowBrowserToReact(){
        /* wait for all myWebWorkers-onchange event, but
           allow browser to react and don't block a full Web Worker 
           Following example is my intension. But will not work, because 
           events are not executed until code excution stops.
        */
        somedata = [];
        for(var i = 0; i < myWebWorkers.length; i++){
            while(!myWebWorkers[i].isReady);
            somedata = somedata.concat(myWebWorkers.result);
        }
    }

我真正需要的是使它运行的waitUntilWorkersAreDoneButAllowBrowserToReact功能或概念。每次搜索涉及Mutex,sleep等时,都以以下语句结尾:“ JS是单线程的”,“仅当您不在循环中时才起作用”,“没有理由具有睡眠功能”。等等。

即使将主要任务传递给另一个工作人员,我也遇到了问题,即该线程有100%的责任检查其他线程是否准备就绪,这浪费了精力和处理能力。

我希望拥有一个像myWebWorker.waitForReady()这样的阻塞函数,该函数仍可以处理事件。这将把javascript推向新的高度。但也许我错过了一个可以做到这一点的简单概念。

谢谢!

贝吉

我很想拥有像myWebWorker.waitForReady()这样的阻塞函数

不,那是不可能的。您研究的所有语句都是正确的,Web Worker保持异步状态,并且仅通过消息进行通信。没有等待事件,甚至在工作线程上也没有。

您将需要为此使用诺言:

function createWorkers(workerCount, src) {
    var workers = new Array(workerCount);
    for (var i = 0; i < workerCount; i++) {
        workers[i] = new Worker(src);
    }
    return workers;
}
function doWork(worker, data) {
    return new Promise(function(resolve, reject) {
        worker.onmessage = resolve;
        worker.postMessage(data);
    });
}
function doDistributedWork(workers, data) {
    // data size is always a multiple of the number of workers
    var elementsPerWorker = data.length / workers.length;
    return Promise.all(workers.map(function(worker, index) {
        var start = index * elementsPerWorker;
        return doWork(worker, data.slice(start, start+elementsPerWorker));
    }));
}

var myWebWorkers = createWorkers(8, 'worker.js');
var somedata = [...];
function step(i) {
    if (i <= 0)
        return Promise.resolve("done!");
    return doDistributedWork(myWebWorkers, somedata)
    .then(function(results) {
        if (i % 100)
            updateSVGonWebPage();
        return step(i-1)
    });
}
step(1000).then(console.log);

Promise.all等待并发运行结果的魔力,该step函数使用递归方法进行异步循环

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在for循环中等待ajax调用完成

来自分类Dev

如何在无限循环中等待函数完成?

来自分类Dev

如何在无限循环中等待函数完成?

来自分类Dev

在 for 循环中等待多个 observable 的结果

来自分类Dev

Javascript:在For循环中等待一个(或多个)条件

来自分类Dev

在循环中等待 Promise

来自分类Dev

如何在 tkinter 中等待多个按键?

来自分类Dev

在游戏循环中等待FutureTask完成

来自分类Dev

在foreach循环中等待的正确方法

来自分类Dev

在for循环中等待异步功能

来自分类Dev

在SetInterval游戏循环中等待动画

来自分类Dev

在游戏循环中等待FutureTask完成

来自分类Dev

在循环中等待 findOneAndUpdate 结束

来自分类Dev

在 for 循环中等待单击事件

来自分类Dev

在 for 循环中等待事件函数

来自分类Dev

如何在VANILLA JS中等待事件进入循环?

来自分类Dev

如何在循环的每次迭代中等待异步操作完成

来自分类Dev

如何在Rx中等待

来自分类Dev

如何在 JQuery 中等待

来自分类Dev

如何在开始异步操作和在循环中等待其结果之间有一个宽限期?

来自分类Dev

如何在循环中训练多个模型

来自分类Dev

在while(1)循环中等待用户输入

来自分类Dev

在循环中等待长时间运行的代码块

来自分类Dev

在while循环中等待连接时停止Runnable

来自分类Dev

在while(1)循环中等待用户输入

来自分类Dev

如何在ExecutePostProcessingAsync中等待异步方法

来自分类Dev

如何在elasticsearch中等待重新索引?

来自分类Dev

如何在Docker Compose中等待MSSQL?

来自分类Dev

如何在ThreadPool中等待任何线程?