2013-06-16 28 views
17

Tôi muốn biết làm thế nào song song thực hiện các công trình trong async.jsNode.js - Async.js: cách thực thi song song hoạt động như thế nào?

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") 
    } 
]); 

Trong ví dụ trên, tôi hy vọng có được kết quả:

chức năng: 2

chức năng: 1

nhưng, giao diện điều khiển ném nghịch đảo, điều gì đang xảy ra? cảm ơn.

+8

Thư viện 'async' không thực hiện tác vụ/'chức năng' không đồng bộ. Nó giả định rằng các tác vụ đã không đồng bộ và đơn giản giúp bạn theo dõi một nhóm chúng. Và, không phải nhiệm vụ của bạn là không đồng bộ. –

Trả lời

22

Bạn nhận được câu trả lời mà bạn không mong đợi bởi vì async khởi chạy function: 1 trước và nó không phát hành kiểm soát trở lại vòng lặp sự kiện. Bạn không có chức năng không đồng bộ trong function: 1.

Node.js là một máy chủ không đồng bộ một luồng. Nếu bạn chặn vòng lặp sự kiện với nhiệm vụ CPU chạy dài thì không có chức năng nào khác có thể được gọi cho đến khi nhiệm vụ CPU chạy dài của bạn kết thúc.

Thay vì sử dụng vòng lặp lớn, hãy thử thực hiện các yêu cầu http. Ví dụ:

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

trong ví dụ này, tôi sẽ quay lại hai lần gọi lại, vậy nó hoạt động như thế nào? không nên có một cuộc gọi lại duy nhất khi cả hai điều này xảy ra? – orepor

+0

Đây chỉ là một ví dụ về việc thực hiện hai yêu cầu cùng một lúc. Đầu ra đi vào giao diện điều khiển. Nếu bạn muốn thu thập đầu ra, bạn sẽ cần một hàm cuối cùng. Xem tài liệu không đồng bộ để biết thêm chi tiết về phương pháp song song. – Daniel

8

Javascrit là đơn luồng trừ khi bạn sử dụng các thư viện/mô-đun đặc biệt. Vì vậy, khi bạn đang thực thi mã này, nó sẽ thực thi hàm đầu tiên và sau đó là hàm thứ hai.

Điều duy nhất mà async.parallel làm là thực hiện tất cả các chức năng và chờ đợi cho tất cả các câu trả lời, và sau đó thực thi mã trong callback.

Vì tất cả mã bạn đã sử dụng đồng bộ nên kết quả sẽ là đồng bộ.

Các vấn đề liên quan