2013-06-20 8 views
6

Trước đó ngày hôm nay tôi đã trả lời một câu hỏi với this answer. Trong ví dụ mà tôi đã đăng, tôi đã sử dụng phiên bản đồng bộ của cuộc gọi trong mô-đun nút bcrypt. Tôi đã chọn sử dụng phiên bản đồng bộ của cuộc gọi chủ yếu bởi vì tôi nghĩ rằng nó làm cho phản hồi trông sạch hơn một chút, nhưng tôi cũng không nghĩ rằng nó sẽ ảnh hưởng đến hiệu suất vì bcrypt là cpu và bộ nhớ chuyên sâu thay vì I/O bị ràng buộc. Đó là sự hiểu biết của tôi rằng nút chạy gần như tất cả các mã của bạn trên một chủ đề duy nhất như trình duyệt làm, và chỉ được sử dụng chủ đề nền cho những thứ như I/O và truy cập cơ sở dữ liệu. Điều này khiến tôi tin rằng các nhiệm vụ chuyên sâu về CPU sẽ vẫn cơ bản "chặn" máy chủ, vì không có chủ đề nào khác để dỡ tải công việc. Một bình luận về câu trả lời của tôi cho thấy giả định của tôi là sai, và sau khi một số nghiên cứu tôi nhận ra rằng tôi đã không thực sự nắm bắt được cách node.js xử lý loại điều này như thế nào. Lập trình không đồng bộ trong node.js có tăng tốc các cuộc gọi chuyên sâu về bộ nhớ và cpu? Nếu vậy, làm thế nào để làm điều đó?Lập trình không đồng bộ trong node.js có tăng tốc các tác vụ liên quan đến CPU không?

+0

"Lập trình không đồng bộ trong node.js có tăng tốc cuộc gọi cpu và bộ nhớ chuyên sâu không?" --- nó giả vờ như vậy. Giống như đồng hồ cát tăng tốc hệ điều hành khi bạn đang nhìn chúng. – zerkms

Trả lời

7

Phụ thuộc vào cách mô-đun được triển khai.

Nếu mô-đun được triển khai mà không có bất kỳ hỗ trợ cho luồng nào thì có, xử lý ràng buộc CPU không thể được thực hiện không đồng bộ. Một số chức năng cung cấp gọi lại và giao diện của tôi không đồng bộ nhưng chúng thực sự không. Chúng thực sự chạy đồng bộ và chặn vòng lặp sự kiện. Ví dụ về điều này trong javascript là Array.forEach().

Tuy nhiên, mô-đun có thể được triển khai để thực hiện quá trình xử lý trong chuỗi nền. Trong trường hợp đó nó thực sự là không đồng bộ và có thể tăng tốc độ các nhiệm vụ ràng buộc CPU. Ít nhất nó giải phóng vòng lặp sự kiện để xử lý các yêu cầu gửi đến trong khi luồng nền là kết quả tính toán bận.

Ví dụ về điều này là hàm crypto.pbkdf2() trong mô-đun Crypto của riêng nút.

Nhưng, làm cách nào các mô-đun có thể thực thi mã trong các luồng khác khi node.js chạy trong một chuỗi duy nhất?

Cách ban đầu này được thực hiện đơn giản là mô-đun không được viết bằng javascript nhưng thay vào đó được viết bằng C/C++ và giao tiếp với node.js qua API addons của nó.

Nhưng những ngày này ngay cả các mô-đun javascript thuần túy và chức năng có thể sinh ra các luồng và/hoặc quy trình. Nút có một mô-đun thử nghiệm được gọi là Cụm để thiết lập một cụm chủ/phụ của các quy trình nút. Sau đó, mô-đun hoặc mã của bạn có thể chạy tác vụ ràng buộc CPU trong một quy trình công nhân giải phóng quy trình nút chính để xử lý vòng lặp sự kiện. Ngoài ra còn có một số mô-đun luồng có sẵn trên npm. Chỉ cần tìm kiếm "chuỗi" trên npmjs.org.

Vì vậy, có các tác vụ ràng buộc CPU có thể được thực hiện để chạy nhanh hơn hoặc ít nhất không chặn vòng lặp sự kiện chính bằng cách chạy không đồng bộ.

+1

Câu trả lời hay. Sau khi xem xét mã nguồn, nó chỉ ra rằng mô-đun bcrypt mà tôi đã đề nghị thực tế sử dụng mã C/C++ để thực hiện các phép tính và sẽ được tăng tốc bởi các cuộc gọi không đồng bộ. Tôi đoán người bình luận trên câu trả lời ban đầu của tôi là đúng, và bạn có thể tốt hơn bằng cách sử dụng các cuộc gọi async theo mặc định, và chỉ chọn các cuộc gọi đồng bộ khi bạn biết nó là cần thiết. – TwentyMiles