如何解决JavaScript中的并行/并发方法执行
我想学习如何在JavaScript中并行/并行运行函数。在过去的几天里,我已经阅读了几页有关Promise,异步函数,回调和等待的页面,但是我发现大多数文章写得不好,不清楚,或者运行时的示例似乎并没有并行运行,但是我怀疑只是该示例使用了setTimout来延迟函数调用,因此这些函数调用不会按照它们在代码中出现的顺序进行。
这就是我说要并行处理时的意思。假设我有两个函数做了很多工作,在此示例中,我们使用计数,我将使用较小的数字,但请想象这些数字是否很大。
var funcA = function(){
for(var x = 0; x < 5;x++) {console.log("A:" + x};
console.log("A done.");
}
var funcB = function(){
for(var x = 0; x < 10;x++) {
console.log("B:" +x}; console.log("B done.");
}
我希望看到是否能够并行运行这些东西,例如:
A:1
A:2
B:1
A:3
B:2
B:3
A:4
B:4
A:5
A Done.
B:5
B:6
B:7
B:8
B:9
B Done.
因此,我一直在medium.com处关注一个示例,并且像这些无数示例中的典型示例一样,它们从未显示出执行任何实际工作的流程,并且我认为超时是用来模拟它的。问题是,很难看到什么超时在并行处理中引起/辅助了,哪些模拟了正在完成的工作。在上面提到的示例中,如果让程序做一些实际的工作,您实际上会发现它是顺序的(我看过的许多示例似乎都是这种方式)。以下示例基于medium.com文章中的示例,但不是使用超时来模拟长时间运行的任务,而是使用循环将0计数为一个随机数(我将超时保留在其中,但已注释取而代之的是,用for循环替换它,并调用 resolve 函数。这使对makeRequest的每次调用大小不同,因此完成顺序应每次更改。
function makeRequest(letter) {
return new Promise((resolve,reject) => {
var rand = Math.random()* 999;
for(var i = 0; i < rand; i++){
console.log(i + " " + letter);
}
resolve({'status':'done ' + letter});
//setTimeout(() => resolve({ 'status': 'done '+letter }),2000);
});
}
async function process(arrayOfPromises) {
console.time(`process`);
let responses = await Promise.all(arrayOfPromises);
for(let r of responses) {console.log(r);}
console.timeEnd(`process`);
return;
}
async function handler() {
let arrayOfPromises = [
makeRequest('a'),makeRequest('b'),makeRequest('c'),makeRequest('d'),makeRequest('e'),];
await process(arrayOfPromises);
console.log(`processing is complete`);
}
handler();
但是,我可以看到,如果我运行代码,它不是并行/并发的,而是顺序的。
A:1
A:2
A:3
A:4
B:1
B:2
B:3
C:1
C:2
C:3
D:1
D:2
D:3
D:4
E:1
E:2
{status: 'done a'}
{status: 'done b'}
{status: 'done c'}
{status: 'done e'}
{status: 'done f'}
问题:
- a)我没有得到什么?
- b)需要做什么 上面的代码,以便JavaScript执行对 makeRequest 会同意吗?
- c)我想在JavaScript中实现什么(鉴于JavaScript的单线程执行和 事件循环)。在我看来,尽管有所有这些博客作者, 称之为并行和并发(我知道它们略有不同 不同的术语)实际上不是!
解决方法
尝试使用一种本质上是同步和单线程的语言进行真正的并行处理是很雄心勃勃的。但并非不可能;)
您找到的所有工具都是错误的。 Promise,async / await (在Promises之上),在此之前的回调,它们都解决了问题。“这将需要一段时间,直到我收到该值的答案,并且我是单线程的,我不想站在时钟旁四处划伤我的头,头,肯定是头!”
他们都没有处理“我的老板要我一分为二并同时在两个地方/一次做两件事。”
网络工作者来了。 Worker允许您在其他线程上执行一些代码。实话实说,我对他们的经验很少,不能仅仅为您提供榜样,但至少我可以为您指明正确的方向。
最终,工人将完成工作并产生某种结果,这就是我们回到Promises and co。的地方。为了处理这样一个事实,在主线程上,我正在等待一些在“其他位置”计算出的值,而最终我将收到该值。但是我不知道什么时候会这样。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。