2016-09-20 49 views
6

Tôi đã tìm hiểu thêm về sự khác biệt giữa đồng thời và song song. Tôi đã đến một cuộc nói chuyện trên YouTube do Rob Pike đưa ra nói về sự khác biệt giữa tính tương tranh và song song. Bài nói chuyện của anh ấy nằm trong ngữ cảnh của ngôn ngữ Google Go. Từ những gì tôi hiểu, đồng thời là thiết kế của việc có thể xử lý nhiều thứ, nhưng song song là việc thực hiện vật lý của nhiều thứ cùng một lúc.Node.js có hỗ trợ song song không?

Từ những gì tôi cũng hiểu, Node.js chạy dưới dạng một quy trình một luồng. Vì vậy, mặc dù Node hỗ trợ đồng thời với cách nó thực hiện callbacks và như vậy, hiện nó có khả năng xử lý thực hiện song song các nhiệm vụ? Nó có thể được thiết lập để chạy nhiều luồng trên bộ xử lý riêng biệt không?

Trả lời

4

Node có thể hỗ trợ "song song" qua một trong hai Cluster hoặc child_process module đóng gói trong API Nodejs Core. Cả hai mô-đun này tạo ra các quy trình bổ sung và không phải là các chuỗi bổ sung.

Chủ đề được tạo và quản lý, đôi khi trong một hồ bơi, "dưới mui xe" của libuvnode thực hiện và sử dụng để thực hiện các hoạt động không đồng bộ như đọc từ một tệp. Bạn không thể tạo chủ đề một cách rõ ràng từ Javascript thực thi của mình. Bạn có thể đọc thêm về libuv tại tài nguyên dưới đây

Ngoài ra, đây là câu hỏi lớn về Threads and Pooling trong đó có rất nhiều chi tiết.

Cluster được sử dụng phân phối khối lượng công việc của Máy chủ qua nhiều lõi và vẫn chia sẻ một cổng. Tuy nhiên, Cluster sử dụng child_process.fork() dưới mui xe và liên lạc qua inter-process communication. Bạn có thể đọc thêm về Cluster in the Nodejs Core API Docs.

child_process cung cấp một số cách khác nhau để song song công việc qua exec(), spawn() hoặc fork(). Quá trình cha mẹ có thể giao tiếp với quá trình con bằng cách sử dụng thông tin liên lạc giữa các quá trình thông qua đường ống.

Về cơ bản, Node muốn bạn tận dụng the event loop và để quản lý chuỗi thành libuv. Đây là lý do tại sao nó rất dễ dàng để xây dựng mã mà thường sẽ yêu cầu khóa và các biện pháp an toàn chủ đề. Nếu bạn phải thực hiện công việc đòi hỏi phải nâng vật nặng hoặc một số lượng đáng kể công việc chặn (đồng bộ), thì bạn có thể sử dụng child_process để giảm tải công việc đó. Nếu bạn cần mở rộng ứng dụng web trên các lõi, hãy sử dụng Cluster.

+0

Tôi đã ấn tượng rằng có ít nhất [một cách] (https://www.npmjs.com/package/webworker-threads) để tạo nhiều luồng thực thi có thể chạy đồng thời giao tiếp bằng cách truyền thông điệp tới lẫn nhau. Có phải vậy không? –

+1

@DavidSchwartz, không có bạn là chính xác, phương pháp đó có thể sử dụng 'child_process' và thực hiện thông điệp đi qua với sự kiện' child_process.on ('message') 'trong tiến trình cha và hàm' process.send() 'trong phần tử con quá trình. Tôi cũng muốn giới hạn câu trả lời của tôi cho những gì Node.js cung cấp như là một phần của chức năng cốt lõi của nó chứ không phải những gói có khả năng cung cấp. – peteb

0

Nếu tôi không nhầm, bạn đang tìm kiếm thứ gì đó dọc theo dòng đa luồng và/hoặc tính toán nhiều thứ cùng một lúc.

Nhiều lần thực hiện cùng một lúc
SIMD đang bắt đầu tìm đường vào Trình duyệt, với triển khai Nút không xa phía sau. Hãy xem node-simd hoặc MDN SIMD (browsers). SIMD vẫn đang thử nghiệm và chỉ hoạt động trên các CPU được hỗ trợ tại thời điểm này (rõ ràng, vì không phải tất cả các CPU đều có chức năng này). Nó thực hiện nhiều việc cùng một lúc, một ví dụ so sánh JS bình thường để SIMD JS sẽ là:

// Normal addition, 4 actions are executed. 
var a = [1, 2, 3, 4]; 
var b = [5, 6, 7, 8]; 
var c = []; 

c[0] = a[0] + b[0]; 
c[1] = a[1] + b[1]; 
c[2] = a[2] + b[2]; 
c[3] = a[3] + b[3]; 
c; // Array[6, 8, 10, 12] 

// SIMD execution - all additions are processed simultaenously through the CPU 
var a = SIMD.Float32x4(1, 2, 3, 4); 
var b = SIMD.Float32x4(5, 6, 7, 8); 
var c = SIMD.Float32x4.add(a,b); 
c; // Float32x4[6, 8, 10, 12] 

Multithreading
Liên quan đến xử lý đa luồng, webworkers đã tồn tại trong môi trường trình duyệt trong một thời gian bây giờ. Điều này đã được chuyển đến Node đầy đủ theo thông số HTML như được thấy in this repository.
Dưới đây là good explanation là lý do tại sao webworkers thậm chí được chuyển đến Nút ở vị trí đầu tiên, vì bạn đã có thể chạy các tiến trình con trong các chủ đề khác và trên các CPU khác với mô-đun child_process. node-webworker là một mô-đun tuyệt vời vì mỗi tiến trình được chạy trong ngữ cảnh của nó, và trong quá trình node riêng của nó, vì vậy nó thực sự đa luồng với nút.

Vì vậy, để chạy các quy trình khác nhau trên các CPU khác nhau, bạn có thể sử dụng node-webworker hoặc sử dụng child_process để sinh ra các luồng khác để thực hiện các hành động riêng biệt cùng lúc với các lõi CPU khác nhau. node-webworker có thể nghe các sự kiện bằng API postMessage quen thuộc và child_process sẽ liên lạc qua stdin/stdout/stderr.

Hy vọng rằng sẽ trả lời câu hỏi của bạn :)

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