Node.js - Async.js: как работает параллельное выполнение?

Я хочу знать, как работает параллельное выполнение в async.js

async = require('async')

async.parallel([
    function(callback){
        for (var i = 0; i < 1000000000; i++) /* Do nothing */;
        console.log("function: 1")
    },
    function(callback){
        console.log("function: 2")
    }
]);

В приведенном выше примере я ожидаю получить результат:

Функция

: 2

: 1

но консоль бросает инверсию, что происходит? спасибо.

Ответы

Ответ 1

Вы получите ответ, которого не ожидаете, потому что async запускает function: 1 первым, и он не освобождает управление обратно в цикле событий. У вас нет функций асинхронизации в function: 1.

Node.js - однопоточный асинхронный сервер. Если вы блокируете цикл событий с длительной работой ЦП, тогда никакие другие функции не могут быть вызваны до завершения вашей долгой задачи ЦП.

Вместо большого цикла for попробуйте сделать http-запросы. Например...

async = require('async')
request = require('request')

async.parallel([
    function(callback){
      request("http://google.jp", function(err, response, body) {
        if(err) { console.log(err); callback(true); return; }
        console.log("function: 1")
        callback(false);
      });
    },
    function(callback){
      request("http://google.com", function(err, response, body) {
        if(err) { console.log(err); callback(true); return; }
        console.log("function: 2")
        callback(false);
      });
    }
]);

Ответ 2

Javascrit является однопоточным, если вы не используете специальные библиотеки/модули. Поэтому, когда вы выполняете этот код, он выполняет первую функцию, а затем вторую.

Единственное, что делает async.parallel, это выполнение всех функций и ожидание всех ответов, а затем выполнение кода в обратном вызове.

Поскольку весь используемый вами код является синхронным, результат будет синхронным.