如何在数组中创建/向 Web 工作人员发布消息



问题很简单:

例:

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

示例结束。

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

目标:创建工作方法:

1:制作未知数量的工作线程数组(基于内核)。

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

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

1:Web Worker 是创建的,只能通过创建它们的事件访问,并且它唯一的接受是 onmessage "event" 处理程序 。

  • 与我的假设相反,有一些东西会对上面写的东西说不通,例如,像线程.js允许线程池和其他过程。

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

谢谢你的时间。

下面是一个示例:

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);
})();

从下面的"示例"部分开始: 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());

最新更新