2013-08-04 34 views
18

Vì vậy, gần đây tôi đã được tiêm virus Node đang lan truyền trong thế giới lập trình rất nhanh.Hiểu NodeJS & Non-Blocking IO

Tôi bị cuốn hút bởi phương pháp "Không chặn khối IO" và thực sự đã tự mình thử một vài chương trình.

Tuy nhiên, tôi không hiểu các khái niệm nhất định tại thời điểm này.

tôi cần câu trả lời trong điều kiện của giáo (người đến từ một nền tảng Java)

1. Đa luồng & Non-Blocking IO.

Hãy xem xét một kịch bản thực tế. Giả sử, chúng tôi có một trang web nơi người dùng có thể đăng ký. Dưới đây sẽ là mã.

.. 
.. 
    // Read HTTP Parameters 
    // Do some Database work 
    // Do some file work 
    // Return a confirmation message 
.. 
.. 

Trong ngôn ngữ lập trình truyền thống, ở trên xảy ra theo cách tuần tự. Và, nếu có nhiều yêu cầu đăng ký, máy chủ web sẽ tạo một chuỗi mới và phần còn lại là lịch sử. Tất nhiên, các lập trình viên có thể tạo ra các chủ đề của riêng mình để làm việc trên Line 2 và Line 3 cùng một lúc.

Trong nút, như tôi đã hiểu, các dòng 2 & 3 sẽ được chạy song song trong khi phần còn lại của chương trình được thực hiện và Bộ thông dịch thăm dò các dòng 2 & 3 mỗi 'x' ms.

Bây giờ, câu hỏi của tôi là, nếu Node là một ngôn ngữ đơn luồng, công việc của các dòng 2 & 3 trong khi phần còn lại của chương trình đang được thực hiện là gì?

2. Khả năng mở rộng

Gần đây tôi đọc mà LinkedIn đã thích nghi Node như một back-end for Mobile Apps của họ và đã thấy những cải tiến lớn.

Có ai có thể giải thích cách nó đã tạo ra sự khác biệt như vậy không?

3. Thích ứng trong ngôn ngữ lập trình khác

Nếu mọi người đang tuyên bố rằng Node được làm cho rất nhiều sự khác biệt khi nói đến hiệu suất, tại sao không có ngôn ngữ lập trình khác thích nghi này Non-Blocking IO mô ?

Tôi chắc chắn tôi đang thiếu thứ gì đó. Chỉ khi bạn có thể giải thích cho tôi và hướng dẫn tôi với một số liên kết, sẽ hữu ích.

Cảm ơn.

+4

Tôi rất khuyên bạn nên xem trình bày ban đầu bằng cách Ryah Dahl (http://www.youtube .com/watch? v = ztspvPYybIY) trả lời tất cả câu hỏi của bạn. –

+0

Cảm ơn Pradeep. Nó đã giúp rất nhiều. –

Trả lời

13

Một câu hỏi tương tự đã được hỏi và có lẽ chứa tất cả các thông tin mà bạn đang tìm kiếm: How the single threaded non blocking IO model works in Node.js

Nhưng tôi sẽ giới thiệu vắn tắt 3 phần của bạn:

1.
Lines 2 và 3 ở dạng rất đơn giản có thể trông giống như:
            db.query (..., function (query_data) {...});
            fs.readFile ('/ path/to/file', function (file_data) {...});

Hiện tại chức năng (truy vấn_data) và chức năng (tệp_data) là gọi lại. Các hàm db.query và fs.readFile sẽ gửi các yêu cầu I/O thực tế nhưng các cuộc gọi lại cho phép xử lý dữ liệu từ cơ sở dữ liệu hoặc tệp bị trì hoãn cho đến khi các phản hồi được nhận. Nó không thực sự "cuộc thăm dò dòng 2 và 3". Các callbacks được thêm vào một vòng lặp sự kiện và được kết hợp với một số bộ mô tả tệp cho các sự kiện I/O tương ứng của chúng. Sau đó nó thăm dò ý kiến ​​các bộ mô tả tập tin để xem chúng có sẵn sàng thực hiện I/O hay không. Nếu có, nó thực hiện các chức năng gọi lại với dữ liệu I/O.

Tôi nghĩ cụm từ "Mọi thứ đều chạy song song trừ mã của bạn" tính tổng hợp tốt. Ví dụ, một cái gì đó giống như "Đọc các tham số HTTP" sẽ thực hiện tuần tự, nhưng các hàm I/O như trong dòng 2 và 3 được kết hợp với các cuộc gọi lại được thêm vào vòng lặp sự kiện và thực thi sau. Vì vậy, về cơ bản toàn bộ điểm là nó không phải chờ I/O.

2.
Bởi vì trong những điều giải thích trong 1., Node quy mô tốt cho I/O thâm yêu cầu và cho phép nhiều người sử dụng phải được kết nối cùng một lúc. Nó đơn luồng, vì vậy nó không nhất thiết phải mở rộng tốt cho các nhiệm vụ chuyên sâu của CPU.

3.
Mô hình này đã được sử dụng với JavaScript vì JavaScript hỗ trợ gọi lại, vòng lặp sự kiện và đóng cửa giúp việc này trở nên dễ dàng. Điều này không nhất thiết phải đúng với các ngôn ngữ khác.

Tôi có thể hơi thất vọng, nhưng đây là ý chính của những gì đang xảy ra.

+0

Cảm ơn người đàn ông .. Tôi đã trải qua một vài video ngay bây giờ và đã bắt đầu để có được nó. –

+1

Giống như @Nathaniel cho biết, mô hình IO không chặn cần hỗ trợ gọi lại, Bất kỳ ngôn ngữ nào có đóng cửa đều có thể triển khai mô hình này .. ReactPHP là một ví dụ http://reactphp.org –

+1

@IssamZoli - Cảm ơn. Tôi tự hỏi làm thế nào tôi quản lý để không thông báo reactphp cho đến bây giờ. Liên kết duy nhất của bạn đã đưa tôi vào một cuộc hành trình khá với phản ứng và sau đó rachet để sử dụng với ứng dụng Laravel của tôi. Cảm ơn một megaton! – techfoobar

3

Q1. "công việc của các dòng 2 & 3 trong khi phần còn lại của chương trình đang được thực hiện là gì?" Trả lời: "Không có gì". Mỗi dòng 2 và 3 mỗi số bắt đầu các công việc tương ứng của chúng, nhưng những công việc đó không thể được thực hiện ngay lập tức bởi vì (ví dụ) các sector đĩa yêu cầu chưa được tải - vì vậy hệ điều hành sẽ gọi đến ổ đĩa , "Không có gì xảy ra" (nút tiếp tục với nhiệm vụ tiếp theo của nó) cho đến khi hệ thống con đĩa (sau này) phát hành gián đoạn để báo cáo chúng đã sẵn sàng, tại đó nút điểm trả về điều khiển cho các dòng # 2 và # 3.

Q2. duy nhất-thread không chặn dành hầu như không có nguồn lực cho mỗi kết nối đến (chỉ là một số dữ liệu vệ sinh về các ổ cắm kết nối). Nó rất hiệu quả về bộ nhớ. Các máy chủ web truyền thống "ngã ba" một quy trình hoàn toàn mới để xử lý mỗi kết nối mới - điều đó có nghĩa là tạo ra một bản sao khổng lồ của mọi mã và các biến dữ liệu cần thiết, và cắt giảm thời gian để xử lý tất cả. Đó là lãng phí rất nhiều tài nguyên. Như vậy - nếu tải của bạn là rất nhiều kết nối nhàn rỗi chờ đợi cho công cụ, như là của họ, nút làm cho tải ý nghĩa hơn.

Q3. hầu như mọi ngôn ngữ lập trình đều đã có I/O không bị chặn nếu bạn muốn sử dụng nó. Node không phải là ngôn ngữ lập trình, đó là máy chủ web chạy javascript và sử dụng I/O không chặn (ví dụ: Cá nhân tôi đã viết điều giống hệt của mình 10 năm trước trong perl, cũng như google (trong C) khi họ bắt đầu và Tôi chắc rằng rất nhiều người khác cũng có máy chủ web tương tự). I/O không chặn không phải là phần cứng - khiến cho người lập trình hiểu cách sử dụng nó là một mẹo nhỏ. Javascript xảy ra để làm việc tốt cho điều đó, bởi vì những lập trình viên đã quen thuộc với lập trình sự kiện.

1

Mặc dù nút.js đã được khoảng một vài năm, đó là mô hình hiệu suất vẫn còn một chút bí ẩn. Gần đây tôi đã bắt đầu một blog và quyết định rằng mô hình node.js sẽ là một chủ đề đầu tiên tốt vì tôi muốn hiểu rõ hơn về bản thân và sẽ hữu ích cho những người khác chia sẻ những gì tôi đã học được. Dưới đây là một vài điều tôi đã viết để giải thích các khái niệm cao cấp và một số cân bằng:

Blocking vs. Non-Blocking I/O – What’s going on?

Understanding node.js Performance