【问题标题】:How to create/postmessage to web workers in an array如何在数组中创建/向网络工作者发送消息
【发布时间】:2018-05-05 06:31:38
【问题描述】:

问题很简单:

例子:

For (iterate based on amount of cores){
   Let worker = workers[I]
   Worker.postmessage
}

示例结束。

免责声明:此示例仅显示了对最终结果的预期,绝不是所谓的“工作条件”。另请注意,上面使用的方法不会为“workers[iterator]”返回一个工作者,而只是未定义。

目标:创建工作方法:

1:制作未知数量的工人数组(基于核心)。

2:一旦构建了该数组,向每个工作人员发布一条消息并返回结果(未定义除外)。

注意:我确实有一个关于它为什么不起作用的假设:

1: web worker 被创建并且只能通过创建它们的事件来访问,并且它唯一的接受是 onmessage "event" handler 。

  • 不顾我的假设,有些东西与上面写的内容差不多,例如 thread.js,它允许线程池和其他过程。

这是我问的主要原因,因为我知道这是可能的,但想要一个简单的答案。

感谢您的宝贵时间。

【问题讨论】:

    标签: javascript multithreading web-worker


    【解决方案1】:

    这是一个例子:

    function createWorker (workerScript) {
        const blob = new Blob([`(${workerScript})(self)`], {type: 'application/javascript'});
        return new Worker(URL.createObjectURL(blob));
    };
    
    function workerCode (self) {
        self.onmessage = function (message) {
            postMessage(`Data from worker: ${message.data}`);
        };
    };
    
    // assuming that you will send only one message to the worker,
    // and that the worker will produce only one message too.
    function workerPromise (worker, message) {
        const promise = new Promise((resolve, reject) => {
            worker.onmessage = resolve;
        }).then(message => message.data);
        worker.postMessage(message);
        return promise;
    }
    
    (async () => {
        const workers = [];
        for (let i = 0; i < navigator.hardwareConcurrency; i++) {
            workers.push(createWorker(workerCode));
        }
    
        const results = await Promise.all(
            workers.map((w, index) => workerPromise(w, `worker ${index}`))
        );
    
        console.log(results);
    })();
    

    【讨论】:

    • 如何发送多条消息?有没有办法只使用你的“createWorker”函数并通过for循环构造一个数组?我只是想要一种在创建后管理无数工人的方法。
    • 我也不知道您的代码应该如何工作或证明它甚至可以工作,但请理解,如果没有,您可能不会发布它。只是想要一个工作示例,我认为在显示工作示例之前不会将此标记为答案(对于我和其他为简单起见而查看的人)
    【解决方案2】:

    从“示例”部分开始:https://developer.mozilla.org/en-US/docs/Web/API/NavigatorConcurrentHardware/hardwareConcurrency

    修改示例:

    // in Main thread
    const numberOfCPUCores = window.navigator.hardwareConcurrency;
    const workerList = [];
    
    const cpuWorkerMessageHandler = event => {
      // process message from a worker by accessing: event.data
    }
    
    for (let i = 0; i < numberOfCPUCores; i++) {
      const newWorker = new Worker('cpuworker.js');
      newWorker.addEventListener("message", cpuWorkerMessageHandler);
      workerList.push(newWorker);
    }
    
    // then, when done with all processing, terminate all workers
    workerList.forEach(w => w.terminate());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-24
      • 1970-01-01
      • 1970-01-01
      • 2017-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多