[JavaScript]有没有办法并行执行多个功能?

时间:2019-06-03 12:10:12

标签: javascript reactjs parallel-processing

我正在尝试在javascript中并行调用多个函数。 可能吗? 例如: 我想获取数字的总和(0到100)。 首先,我要并行计算[1,2 ... 50][51,52 ..., 100]的部分和。

let sum1 = 0, sum2 = 0;
for(let i = 1; i < 51; i++) { sum1 += i}
for(let j = 51; j < 100; j++) {sum2 += j}
sum = sum1 + sum2;

我认为我可以使用Parallel.invoke()在C#中做到这一点,但是在Javascript中可以吗? 还是在ReactJS中有可能?

2 个答案:

答案 0 :(得分:2)

Javascript是一种单线程非阻塞编程语言,因此它不像C#或Python那样为多线程提供任何本机支持。但是,如果您的代码在Node.js上运行,则可以使用Worker API (Doc)或编写C ++插件来进行大量计算。在浏览器中,我认为您可以使用网络工作者,但我没有资格谈论它。

答案 1 :(得分:2)

是的。

在NodeJS中,您可以使用fork()或the cluster api运行并发任务并侦听来自主节点的消息,它不完全是线程,nodeJS是单线程,您将创建新进程。

在浏览器中,您可以使用webworkers,它类似于其他语言的线程。 WebWorkers在某些移动浏览器中不是fully supported

编辑1:当然,这是一个nodeJS示例,您将不得不自己做“等待”部分,但是您有了这个概念。

const cluster = require('cluster');

if (cluster.isMaster) {
    const nodes = 4;
    const limit = 40000;
    const nEachNode = (limit / nodes) |0;


    for (let i = 0; i < nodes; i++) {
        let worker = cluster.fork();
        worker.send({ start: nEachNode * i, end: nEachNode });
        worker.on('message', handleResponse);
    }

    let total = 0;
    function handleResponse(response) {
        total += response;
        console.log(`worker answered, total: ${total}`);
    }

    cluster.on('exit', (worker, code, signal) => {
        console.log(`worker ${worker.process.pid} died`);
    });
} else {
    console.log(`Worker ${process.pid} started`);
    process.on('message', start);

    function start(conf) {
        let cumulative = 0;
        for (let i = conf.start; i < conf.start + conf.end; i++) {
            cumulative += i;
        }
        process.send(cumulative);
        process.exit();
    }
}