繁体   English   中英

如何在 JavaScript 中模拟工作线程?

[英]How can I simulate worker threads in JavaScript?

我有一个功能,我必须接收来自不同用户的项目(用一些 ID 标识)并按相对顺序处理它们(因此用户 A 的项目 1 在用户 A 的项目 2 之前处理,但与用户 B 相比,对订单没有限制第 N 项)。 为了提高吞吐量,我想异步处理它们。

我之前已经使用多线程语言和并发队列完成了此操作,如果队列中不再有任何内容,则让线程处于忙碌等待状态。 但我不知道如何用 JavaScript 的单线程解决这个问题。 我正在考虑在内部使用 Promises 和无限循环,但我不知道这是否是一种反模式。

作为一个限制,我的客户不愿使用未经其审计团队批准的外部库,因此我正在尝试手工完成此操作。

谢谢

你通常不会在 JavaScript 中忙着等待。 但是,您可以做的许多事情(向 Web 服务器发送请求、加载图像(与向 Web 服务器发送请求、等待用户输入相同)采用回调或返回承诺(另一种形式的回调) )

使用async/await处理异步事物列表非常容易

 function doThing(thingMsg) { // this just represents some process that runs async return new Promise((resolve) => { const duration = Math.random() * 500 + 1500; // 0.5 to 2 seconds setTimeout(() => { resolve(thingMsg); }, duration); }); } const userAToDoList = [ 'mix flour', 'knead', 'bake', 'slice', ]; const userBToDoList = [ 'chop', 'fry', 'braise', 'combine', ]; async function doListInOrder(list, userName) { for (const item of list) { const result = await doThing(item); console.log(`${userName} did ${result}`); } console.log(`${userName} finished`); } doListInOrder(userAToDoList, 'userA'); doListInOrder(userBToDoList, 'userB');

doThing替换为您想要做的事情,例如“等待文件下载”、“等待图像下载”或“等待工作人员的某些事情”等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM