为了账号安全,请及时绑定邮箱和手机立即绑定

JavaScript 中的并行编程

JavaScript 中的并行编程

PIPIONE 2021-06-11 17:00:42
我正在用 javascript 进行顺序和并行编程,我能够解决顺序编程,但不知道如何使用并行编程来做同样的事情。对于顺序问题是:这是一个顺序处理的例子,它从 1 开始,一直到 3,然后加上 21。然后它将从 1 开始,直到 2 并添加 10。最后,从 1 开始,一直到 4,然后加 1。对于输入:1 3*21#2*10#4*1 输出将是:22232411122345我使用下面的代码解决了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输出应该是:2122511015253我没有尝试使用并行但以毫秒排序但无法获得预期的输出。这是第二个 .. 的 JSfiddle 代码,它给出了错误的输出(我没有使用并行方法): https://jsfiddle.net/mahajan344/0u2ka981/如何使用并行 JavaScript 编程实现相同的输出?
查看完整描述

2 回答

?
冉冉说

TA贡献1877条经验 获得超1个赞

考虑:


async function delay(n) {

    return new Promise(r => setTimeout(r, n));

}


async function* asyncRange(a, b, d) {

    while (a < b) {

        await delay(d);

        yield a++;

    }

}


async function parallel(...ranges_and_delays) {

    let iters = ranges_and_delays.map(t => asyncRange(...t));


    while (iters.length) {

        await Promise.race(iters.map(async it => {

            let v = await it.next();

            if (!v.done) {

                console.log(v.value)

            } else {

                iters = iters.filter(k => k !== it)

            }

        }));

    }

}



parallel([1, 5, 700], [10, 13, 500], [200, 205, 600])

这个想法是将范围生成器放在一个数组中,race在它们之间启动 a并打印先出现的内容。一旦发电机耗尽,将其从列表中删除。


请注意,这不是真正的并行计算(这在 Javascript 中是不可能的),只是一种模仿。


查看完整回答
反对 回复 2021-06-18
?
手掌心

TA贡献1942条经验 获得超3个赞

我认为使用 setTimeout 解决问题的方法可能是:


function printParallel(val, delay)

{

    setTimeout(function()

    {

        console.log(val);

    }, delay);

}


function solution(inputData) { 

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

    var strArr = inputData.split(" ");

    var strHashSplitArr = strArr[1].split("#");


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

    {

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

        var maxVal = parseInt(loopInp[0]);

        var modifier = parseInt(loopInp[1]);


        if (first == 1)

        {

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

            {

                console.log(j+modifier);

            }

        }

        else if (first == 2)

        {

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

            {

                printParallel(j+modifier, modifier);

            }

        }

    }

}

因此,您将调用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)

{

    setTimeout(function()

    {

        console.log(value+modifier);

        if (value < maxVal)

        {

            printParallel(++value, maxVal, modifier)

        }

    }, modifier);

}


function solution(inputData) { 

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

    var strArr = inputData.split(" ");

    var strHashSplitArr = strArr[1].split("#");


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

    {

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

        var maxVal = parseInt(loopInp[0]);

        var modifier = parseInt(loopInp[1]);


        if (first == 1)

        {

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

            {

                console.log(j+modifier);

            }

        }

        else if (first == 2)

        {

            printParallel(1, maxVal, modifier);

        }

    }

}


查看完整回答
反对 回复 2021-06-18
  • 2 回答
  • 0 关注
  • 148 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信