猿问

JavaScript 中的并行编程

我正在用 javascript 进行顺序和并行编程,我能够解决顺序编程,但不知道如何使用并行编程来做同样的事情。


对于顺序问题是:


这是一个顺序处理的例子,它从 1 开始,一直到 3,然后加上 21。然后它将从 1 开始,直到 2 并添加 10。最后,从 1 开始,一直到 4,然后加 1。


对于输入:1 3*21#2*10#4*1 输出将是:


22

23

24

11

12

2

3

4

5

我使用下面的代码解决了


function solution(inputData) { 


    var first = inputData.substring(0, 1);

    if(first == 1)

    {

        //sequential

      var strArr = inputData.split(" ");  //3*21#2*10#4*1

      var strHashSplitArr = strArr[1].split("#");  //3*21 #2*10# 4*1

      for(var i=0;i<strHashSplitArr.length;i++)

      {

        var loopInp = strHashSplitArr[i].split("*");

        var maxVal = parseInt(loopInp[0]);

        var addVal = parseInt(loopInp[1]);


        for(var k=1;k<=maxVal;k++)

        {

        console.log(k+addVal);

        }

      }

    }

但现在的问题是并行编程


问题:


例如 2,有 3 个进程并行启动,编号为 1、2 和 3,延迟时间为 100、20 和 50。在这里,所有进程将一起开始,但将首先打印延迟较少的数字。这里延迟较少的数字是 2.So 它将打印 21,22 同时将实现 50 ms,它将从第 3 个数字打印 51。现在它与数字 1 混合并打印 101 等等。


输入 : 2 1*100#2*20#3*50


输出应该是:


21

22

51

101

52

53

我没有尝试使用并行但以毫秒排序但无法获得预期的输出。


这是第二个 .. 的 JSfiddle 代码,它给出了错误的输出(我没有使用并行方法): https://jsfiddle.net/mahajan344/0u2ka981/


如何使用并行 JavaScript 编程实现相同的输出?


PIPIONE
浏览 149回答 2
2回答

冉冉说

考虑:async function delay(n) {&nbsp; &nbsp; return new Promise(r => setTimeout(r, n));}async function* asyncRange(a, b, d) {&nbsp; &nbsp; while (a < b) {&nbsp; &nbsp; &nbsp; &nbsp; await delay(d);&nbsp; &nbsp; &nbsp; &nbsp; yield a++;&nbsp; &nbsp; }}async function parallel(...ranges_and_delays) {&nbsp; &nbsp; let iters = ranges_and_delays.map(t => asyncRange(...t));&nbsp; &nbsp; while (iters.length) {&nbsp; &nbsp; &nbsp; &nbsp; await Promise.race(iters.map(async it => {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; let v = await it.next();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!v.done) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; console.log(v.value)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; iters = iters.filter(k => k !== it)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }));&nbsp; &nbsp; }}parallel([1, 5, 700], [10, 13, 500], [200, 205, 600])这个想法是将范围生成器放在一个数组中,race在它们之间启动 a并打印先出现的内容。一旦发电机耗尽,将其从列表中删除。请注意,这不是真正的并行计算(这在 Javascript 中是不可能的),只是一种模仿。

手掌心

我认为使用 setTimeout 解决问题的方法可能是:function printParallel(val, delay){&nbsp; &nbsp; setTimeout(function()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; console.log(val);&nbsp; &nbsp; }, delay);}function solution(inputData) {&nbsp;&nbsp; &nbsp; var first = inputData.substring(0, 1);&nbsp; &nbsp; var strArr = inputData.split(" ");&nbsp; &nbsp; var strHashSplitArr = strArr[1].split("#");&nbsp; &nbsp; for (var i = 0; i < strHashSplitArr.length; i++)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; var loopInp = strHashSplitArr[i].split("*");&nbsp; &nbsp; &nbsp; &nbsp; var maxVal = parseInt(loopInp[0]);&nbsp; &nbsp; &nbsp; &nbsp; var modifier = parseInt(loopInp[1]);&nbsp; &nbsp; &nbsp; &nbsp; if (first == 1)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (var j = 1; j <= maxVal; j++)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; console.log(j+modifier);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; else if (first == 2)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (var j = 1; j <= maxVal; j++)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printParallel(j+modifier, modifier);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}因此,您将调用solution("1 3*21#2*10#4*1");并solution("2 1*100#2*20#3*50");执行示例,但这不会按预期输出,因为数字 1 的 100 的延迟太大而无法与数字 3 的打印混合。编辑:我想现在我明白了目标:你需要在每个 console.log 之间设置一个超时。这将按预期工作:function printParallel(value, maxVal, modifier){&nbsp; &nbsp; setTimeout(function()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; console.log(value+modifier);&nbsp; &nbsp; &nbsp; &nbsp; if (value < maxVal)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printParallel(++value, maxVal, modifier)&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }, modifier);}function solution(inputData) {&nbsp;&nbsp; &nbsp; var first = inputData.substring(0, 1);&nbsp; &nbsp; var strArr = inputData.split(" ");&nbsp; &nbsp; var strHashSplitArr = strArr[1].split("#");&nbsp; &nbsp; for (var i = 0; i < strHashSplitArr.length; i++)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; var loopInp = strHashSplitArr[i].split("*");&nbsp; &nbsp; &nbsp; &nbsp; var maxVal = parseInt(loopInp[0]);&nbsp; &nbsp; &nbsp; &nbsp; var modifier = parseInt(loopInp[1]);&nbsp; &nbsp; &nbsp; &nbsp; if (first == 1)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (var j = 1; j <= maxVal; j++)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; console.log(j+modifier);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; else if (first == 2)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printParallel(1, maxVal, modifier);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答