javascript - 在工作线程之间共享负载的最佳方式

标签 javascript node.js typescript multithreading deno

在工作线程之间共享线性任务以提高性能的最佳方式是什么?

以下面的基本 Deno Web 服务器为例:

主线程

// Create an array of four worker threads
const workers = new Array<Worker>(4).fill(
    new Worker(new URL("./worker.ts", import.meta.url).href, {
        type: "module",
    })
);

for await (const req of server) {
    // Pass this request to worker a worker thread
}

worker.ts

self.onmessage = async (req) => {
  //Peform some linear task on the request and make a response
};



分配任务的最佳方式是否与此类似?

function* generator(): Generator<number> {
    let i = 0;
    while (true) {
        i == 3 ? (i = 0) : i++;
        yield i;
    }
}

const gen = generator();

const workers = new Array<Worker>(4).fill(
    new Worker(new URL("./worker.ts", import.meta.url).href, {
        type: "module",
    })
);

for await (const req of server) {
    // Pass this request to a worker thread
    workers[gen.next().value].postMessage(req);
}

或者有更好的方法吗?例如,使用 Attomics 来确定哪些线程可以自由地接受另一个任务。

最佳答案

当使用这样的 WorkerThread 代码时,我发现分配作业的最佳方法是当 WorkerThread 知道前一个作业已完成时,让 WorkerThread 向主线程请求作业。然后主线程可以向其发送一个新作业以响应该消息。

在主线程中,我维护了一个作业队列和一个等待作业的 WorkerThreads 队列。如果作业队列为空,那么 WorkerThread 队列中可能会有一些工作线程在等待作业。然后,每当将作业添加到作业队列时,代码都会检查是否有工作线程在等待,如果有,则将其从队列中删除并向其发送下一个作业。

每当workerThread发送一条消息表明它已准备好执行下一个作业时,我们就会检查作业队列。如果那里有工作,它就会被删除并发送给该 worker 。如果没有,则将工作线程添加到 WorkerThread 队列中。

这整个逻辑非常干净,不需要原子或共享内存(因为所有内容都是通过主进程的事件循环进行门控的)并且代码不多。

我在尝试了其他几种方法后才得出了这种机制,每种方法都有各自的问题。在一种情况下,我遇到了并发问题,在另一种情况下,我让事件循环挨饿,在另一种情况下,我没有对 WorkerThreads 进行适当的流量控制,并且压垮了它们,并且没有平均分配负载。

关于javascript - 在工作线程之间共享负载的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67709140/

相关文章:

javascript - 当用户在 Angular 6 中键入时更改输入字段文本

javascript - 如何将 Vue 插件发布到 NPM?

javascript - 如何将条件传递给运行 setTimeout 的函数

javascript - 使用 jQuery 在链接上调用内联 JavaScript

javascript - l20n:服务器端 Node resolveValues错误

javascript - HighCharts:删除网格线悬垂(Angular/TypeScript)

javascript - 根据用户输入自动完成字段重定向到 URL

javascript - 影子根 getElementsByClassName

node.js - 使 npm start 脚本在特定端口运行 ng 服务

node.js - 如果 Node 5 已安装在 Windows 上,如何安装 Node 4 版本