2013-06-16 7 views
17

Я хочу знать, как параллельное выполнение работ в async.jsNode.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

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

+8

Библиотека 'async' не делает задачу /' function' асинхронной. Он предполагает, что задачи уже асинхронны и просто помогает вам отслеживать группу из них. И ни одна из ваших задач не асинхронна. –

ответ

22

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

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

Вместо этого для большого цикла, попробуйте написать 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); 
     }); 
    } 
]); 
+0

в этом примере, я передам два обратных вызова, так как это работает? не должен ли быть один обратный вызов, как только они происходят? – orepor

+0

Это был всего лишь пример выполнения двух запросов одновременно. Выход идет на консоль. Если вы хотите собрать результат, вам понадобится конечная функция. Ознакомьтесь с асинхронной документацией для получения более подробной информации о параллельном методе. – Daniel

8

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

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

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

Смежные вопросы