[JavaScript] Есть ли способ параллельно выполнять несколько функций? - PullRequest
0 голосов
/ 03 июня 2019

Я пытаюсь вызвать несколько функций параллельно в 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;

Я думаю, что могу сделать это в C #, используя Parallel.invoke(), но возможно ли это в Javascript?Или это возможно в ReactJS?

Ответы [ 2 ]

2 голосов
/ 03 июня 2019

Да, это так.

В NodeJS вы можете использовать fork () или кластер api для запуска параллельных задач и прослушивания сообщений от главного узла, это не совсем поток, nodeJS - это монопоточная версия, вы будете создавать новые процессы.

В браузере вы можете использовать webworkers , это похоже на темы на других языках. WebWorkers не поддерживаются полностью в некоторых мобильных браузерах.

РЕДАКТИРОВАТЬ 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();
    }
}
2 голосов
/ 03 июня 2019

Javascript - это однопоточный неблокирующий язык программирования, поэтому он не предлагает никакой встроенной поддержки многопоточности, как это было бы в C # или Python. Однако, если ваш код выполняется на Node.js, вы можете использовать Worker API (Doc) или написать плагин C ++ для выполнения тяжелых вычислений. В браузере, я думаю, вы могли бы использовать веб-работников, но я не компетентен, чтобы говорить об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...