2012-02-29 30 views
43

Tôi không hiểu nhiều điều về nodej. Mỗi nguồn thông tin nói rằng node.js có khả năng mở rộng hơn so với các máy chủ web tiêu chuẩn do thiếu các luồng khóa và chuyển ngữ cảnh, nhưng tôi tự hỏi, nếu node.js không sử dụng các luồng như thế nào thì nó xử lý các yêu cầu đồng thời song song? Mô hình I/O sự kiện có nghĩa là gì?Cách node.js hoạt động?

Trợ giúp của bạn được đánh giá cao. Cảm ơn

Trả lời

74

Nút hoàn toàn hướng sự kiện. Về cơ bản, máy chủ bao gồm một quy trình xử lý một sự kiện sau một sự kiện khác.

Yêu cầu mới sắp tới là một loại sự kiện. Máy chủ bắt đầu xử lý nó và khi có một hoạt động IO chặn, nó không đợi cho đến khi nó hoàn thành và thay vào đó đăng ký một hàm gọi lại. Máy chủ sau đó ngay lập tức bắt đầu xử lý một sự kiện khác (có thể là một yêu cầu khác). Khi hoạt động IO kết thúc, đó là một loại sự kiện khác và máy chủ sẽ xử lý nó (tức là tiếp tục làm việc theo yêu cầu) bằng cách thực hiện cuộc gọi lại ngay khi có thời gian.

Vì vậy, máy chủ không bao giờ cần phải tạo thêm chủ đề hoặc chuyển đổi giữa các chủ đề, có nghĩa là nó có rất ít chi phí. Nếu bạn muốn tận dụng tối đa đa lõi phần cứng, bạn chỉ cần bắt đầu nhiều trường hợp của Node.js

Cập nhật Ở cấp thấp nhất (C++, không Javascript), there actually are multiple threads trong Node.js: có một hồ bơi của công nhân IO có công việc nó là để nhận được ngắt IO và đặt các sự kiện tương ứng vào hàng đợi để được xử lý bởi các chủ đề chính. Điều này ngăn cản các chủ đề chính bị gián đoạn.

+1

Cảm ơn Michael. Tôi hiểu rằng các hoạt động IO không đồng bộ là bản chất của JS, nhưng những gì tôi không hiểu là, nếu node.js/JS là một luồng đơn, thì nó xử lý các hoạt động async như thế nào. Nó có thể chạy hoạt động I/O không đồng bộ song song với mã phía máy chủ, nhưng làm thế nào. – Davita

+3

@Davita: Các hoạt động I/O không được CPU thực hiện. Mã phía máy chủ không phải tham gia cho đến khi phần cứng bên ngoài đã lấp đầy một số bộ đệm và cho CPU biết về điều này thông qua một cơ chế ngắt. –

+5

@Davita có một ghi chú nhỏ về vòng lặp sự kiện node.js tại đây: http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/ – LoG

0

Mặc dù Câu hỏi đã được giải thích trước một thời gian dài, tôi đang đặt suy nghĩ của mình giống nhau.

Node JS là công nghệ luồng đơn. Về cơ bản, người tạo ra Node JS (Ryan Dahl) quan tâm là việc xử lý song song bằng cách sử dụng nhiều luồng không phải là cách đúng đắn hoặc quá phức tạp.

nếu Node.js không sử dụng đề như thế nào xử lý yêu cầu đồng thời song song

Ans: Đó là hoàn toàn sai câu khi bạn nói nó không sử dụng đề, Node Js đề sử dụng nhưng một cách thông minh. Nó sử dụng chủ đề duy nhất để phục vụ tất cả các yêu cầu HTTP & nhiều bài trong chủ đề bơi (trong libuv) để xử lý bất kỳ hoạt động chặn

Libuv: Một thư viện để xử lý không đồng bộ I/O.

Mô hình I/O sự kiện có nghĩa là gì?

Trả lời: Đúng hạn là không chặn I/O. Nó gần như không bao giờ chặn như trang web chính thức của Node JS nói. Khi bất kỳ yêu cầu nào đến máy chủ nút, nó sẽ không bao giờ xếp hàng yêu cầu. Nó yêu cầu và bắt đầu thực thi nếu nó chặn hoạt động thì nó được gửi đến vùng chủ đề làm việc và đăng ký một cuộc gọi lại giống như ngay sau khi thực thi mã xong, nó kích hoạt cùng một cuộc gọi lại và chuyển đến hàng đợi sự kiện và xử lý bởi vòng lặp sự kiện một lần nữa sau tạo phản hồi và gửi cho khách hàng tương ứng.

Liên kết hữu ích: click here

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