2012-08-27 40 views
18

Mã không có hiệu quả đạt được bằng cách đồng bộ không? Tại sao mã hóa đồng bộ một chiến thắng? tôi thấy hai liên kết này trong thực hiện một số nghiên cứu: http://bjouhier.wordpress.com/2012/03/11/fibers-and-threads-in-node-js-what-for/, https://github.com/Sage/streamlinejs/Tại sao meteor.js đồng bộ?

Nếu mục tiêu là để ngăn chặn mã spaghetti, thì rõ ràng bạn có thể có mã không đồng bộ, với streamline.js ví dụ, đó không phải là một kim tự tháp gọi lại, đúng?

Trả lời

33

Bạn phải phân biệt hai điều ở đây:

  • chức năng đồng bộ như nút của fs.readFileSync, fs.statSync, vv Tất cả các chức năng này có một Sync trong tên của họ (*). Các chức năng này thực sự là đồng bộchặn. Nếu bạn gọi cho họ, bạn chặn vòng lặp sự kiện và bạn giết hiệu suất của nút. Bạn chỉ nên sử dụng các hàm này trong tập lệnh khởi tạo của máy chủ (hoặc trong các tập lệnh dòng lệnh).
  • Các thư viện và công cụ như sợi hoặc streamline.js. Các giải pháp này cho phép bạn viết mã của mình theo kiểu kiểu đồng bộ nhưng mã bạn viết với chúng vẫn sẽ thực thi không đồng bộ. Họ làm không phải chặn vòng lặp sự kiện.

(*) require cũng đang chặn.

Sử dụng thiên thạch sợi. Mã của nó được viết theo kiểu đồng bộ nhưng nó không bị chặn.

Chiến thắng không ở bên hiệu suất (các giải pháp này có chi phí riêng để chúng có thể chậm hơn nhưng cũng có thể làm tốt hơn gọi lại thô trên các mẫu mã cụ thể như bộ nhớ đệm). Chiến thắng, và lý do tại sao các giải pháp này đã được phát triển, nằm ở phía khả năng sử dụng: chúng cho phép bạn viết mã theo kiểu đồng bộ, ngay cả khi bạn đang gọi các hàm không đồng bộ.

ngày 25 tháng một năm 2017 chỉnh sửa: Tôi tạo ra 3 GIST để minh họa non-blocking sợi: "Họ không chặn vòng lặp sự kiện" fibers-does-not-block.js, fibers-sleep-sequential.js, fibers-sleep-parallel.js

+0

Tuyên bố là gây hiểu lầm vì các sợi phải chặn vòng lặp sự kiện trong các phần quan trọng. Đó là vào nhà phát triển để quyết định những phần quan trọng là gì và sử dụng sợi một cách thích hợp. – ashim

+0

@ashim. Điều này là sai: sợi không được ưu tiên; bối cảnh chuyển đổi giữa các sợi được thực hiện bởi libcoro và được tách hoàn toàn khỏi vòng lặp sự kiện. –

+0

Tôi đang bối rối. Nếu tôi đặt các hoạt động i/o bên trong một sợi, giữa các lệnh fiber.run() fiber.yield(), thì phần còn lại của chương trình sẽ đợi cho đến khi phần mã được thực hiện. Làm thế nào nó không bị chặn? Tôi có hiểu nhầm điều gì đó không? – ashim

3

Mã không phải là "đồng bộ" khi sử dụng một cái gì đó như streamlinejs. Mã thực tế sẽ vẫn chạy không đồng bộ. Nó không phải là rất đẹp để viết rất nhiều chức năng gọi lại vô danh, đó là nơi những điều này giúp.

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