javascript HTML5/JS -启动多个网络工作者

lhcgjxsq  于 2023-02-02  发布在  Java
关注(0)|答案(2)|浏览(144)

我目前正在写一个程序,在那里我必须处理巨大的数组。但是我可以拆分这些数组。我现在的计划是,在不同的Web工作器中处理数组。但是我从来没有使用过它们,并且确实有几个问题:

    • 1.**如何运行多个Web工作者?我尝试了一个如下所示的for循环:
for(i = 0; i < eD.threads; i++){
    //start workers here 
    var worker = new Worker("js/worker/imageValues.js");
    worker.postMessage(brightness, cD.pixels[i]);
}

在这里我得到了错误,对象不能被克隆。这似乎是合乎逻辑的。我想这将是更好地保存在一个数组?

    • 2.**我如何控制所有人都完成了他们的工作?(我需要重新组装数组,稍后再处理它)
    • 3.**有多少网络工作者真正带来了改进?
    • 4.**除了MDN条目之外,是否还有其他高级教程?

谢谢大家!

7gyucuyw

7gyucuyw1#

1.我如何运行多个Web工作者呢?我尝试了一个如下所示的for循环:
创建一个以上的worker没有问题,即使您没有在数组中跟踪它们。
2.我如何控制所有人都完成了他们的工作?(我需要重新组装数组并在以后使用它)
他们可以在完成后给你发一条消息,告诉你结果。
3.有多少网络工作者真正带来了进步?
一个字符串的长度是多少?:-)答案取决于运行它的目标机器,运行代码的性质以及它使用的其他资源等。你必须针对你的目标环境和任务进行调整。你可以在浏览器上使用navigator.hardwareConcurrency,在Node.js上使用Deno或os.cpus来找出有多少个内核可用,但记住你是在与机器上的其他进程共享这些内核,而不仅仅是你的JavaScript代码在运行。
4.除了MDN入门,还有其他高级教程吗?
关于Web工作者没有太多的"高级"。:-)我发现this article已经足够了。
下面是一个运行五个工作线程并等待它们完成的示例:
主窗口:

display("Starting workers...");
let running = 0;
for (let n = 0; n < 5; ++n) {
    workers = new Worker("worker.js");
    workers.onmessage = workerDone;
    workers.postMessage({ id: n, count: 10000 });
    ++running;
}
function workerDone(e) {
    --running;
    display("Worker " + e.data.id + " is done, result: " + e.data.sum);
    if (running === 0) {
        // <== There is no race condition here, see below
        display("All workers complete");
    }
}
function display(msg) {
    const p = document.createElement("p");
    p.innerHTML = String(msg);
    document.body.appendChild(p);
}

worker.js

this.onmessage = (e) => {
    let sum = 0;
    for (let n = 0; n < e.data.count; ++n) {
        sum += n;
    }
    this.postMessage({ id: e.data.id, sum: sum });
};

关于不存在的争用条件:如果您从真正的抢占式线程的Angular 来考虑,那么您可能会认为:我可以创建一个worker,将running递增到1,然后在创建下一个worker之前,我可以从第一个worker获得完成的消息,将running递减到0,并错误地认为所有worker都已完成。
这在Web辅助进程工作的环境中是不可能发生的。尽管环境可以在它喜欢的时候启动辅助进程,并且辅助进程可以在启动辅助进程的代码完成之前完成,所要做的只是将主JavaScript线程对workerDone函数的调用 * 排队 *,没有抢占。所以我们知道在第一次调用workerDone之前所有的工作线程都已经启动了,所以当running0时,我们知道它们都已经完成了。
最后说明:在上面的代码中,我使用onmessage = ...来连接事件处理程序,这自然意味着我只能在对象上使用一个事件处理程序,如果您需要为message事件使用多个处理程序,使用addEventListener。所有支持Web工作者的浏览器都支持addEventListener(您不必担心IE attachEvent的问题)。

waxmsbnn

waxmsbnn2#

stiller_leser.如果你还在解决这个问题,看看ng-vkthread插件。它允许你实现并行计算技术,这是你在项目中尝试开发的。使用这个插件,你可以在多个线程中同时执行多个函数。
函数可以直接在主线程中定义,也可以从外部JavaScript文件中调用。
功能可以是:

  • 正则函数
  • 对象的方法
  • 具有依赖项的函数
  • 带上下文的函数
  • 匿名函数

基本用途:

/* function to execute in a thread */
function foo(str) {
    return str.toUpper();
}

function bar(str) {
    return str.toUpper();
}

// to execute these 2 functions in 2 threads: //

/* create objects, which you pass to vkThread as an argument*/
var param1 = {
      fn: foo,
      args: ['hello']
  };
var param2 = {
      fn: bar,
      args: ['world']
  }

/* run thread */
vkThread.execAll([param1,param2]).then(
  function (data) {
    $scope.repos = data[0] + ' ' + data[1]; // <-- HELLO WORLD
  }
);

示例和API文档:http://www.eslinstructor.net/ng-vkthread/demo/
希望这能帮上忙,

  • -瓦迪姆

相关问题