gpt4 book ai didi

javascript - 如何在 JS Web Worker 中循环查询 Worker 可用性而不阻塞

转载 作者:行者123 更新时间:2023-12-02 16:21:05 28 4
gpt4 key购买 nike

我对 Web Worker 和多线程设计还很陌生,我需要设计一个简单的查询任务调度程序(现在使用 Web Worker),例如:

var taskScheduler = {};
taskScheduler.pool = [];
function init(num){
for(var i=0; i<num; i++){
var workUnit = {};
var worker = new Worker("worker.js");
workUnit.busy = false;
workUnit.worker = worker;
taskScheduler.pool.push( workUnit );
}
}
init(4);

下面的代码应该是循环查询workUnit可用性并开始新工作我不太确定如何实现,我认为应该是这样的:

taskScheduler.startWork = function(task){
for(var i=0; i<taskScheduler.pool.length; i++){
if(!taskScheduler.pool.busy){ // fire job, make unit busy then break; }
}
}

目前主要挑战是:

如何在继续检查工作人员可用性的同时仍然能够接受新的任务调用(例如:如果没有可用的工作人员,它将不断询问这将阻止接受 taskScheduler.startWork 的新工作调用的能力)

最佳答案

检查 worker 的可用性从一开始就是错误的概念。 JavaScript 是事件驱动语言。您不会轮询更改,而是使用事件监听它们。

您应该执行以下操作:

var tasksToProcess = [/*{task: this is sent to worker, onfinish: onfinish callback}*/];
var processedTask = null;
var worker = new Worker("taskProcessor.js");
// The worker dispatches a message when task is completed
worker.addEventListener("message", function(event) {
//Usually I give messages names to simulate Javascript event style
if(event.data.name == "task_success") {
if(processedTask!=null) {
if(processedTask.onfinish instanceof Function)
// If onfinish throws error, it will not crash this function
setTimeout(processedTask.onfinish,0);
processedTask = null;
}
else
console.error("Weird, task sucessfully completed when no task was running.");
// No matter what, try to start next task
runNextTask();
}
});
function runNextTask() {
// Only run when no task is being processed
if(processedTask==null && tasksToProcess.length>0) {
//Shift removes and returns first value of array
processedTask = tasksToProcess.shift();
worker.postMessage({name:"task", task: processedTask.task});
}
}
/// Task in format {task: task data, onfinish: finish event callback}
function addTask(task) {
// Add task to the end
tasksToProcess.push(task);
runNextTask();
}

只要 Worker 在完成任务后正确调用消息,这就会起作用。您还应该实现 Worker onerror 回调,以便您可以从错误中恢复。

关于javascript - 如何在 JS Web Worker 中循环查询 Worker 可用性而不阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34598481/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com