Sự khác biệt giữa kiến ​​trúc hướng sự kiện Node.js và lập trình đa luồng trong các ngôn ngữ khác là gì?


Câu trả lời 1:

Cả trong mô hình hướng sự kiện và mô hình đa luồng, mã chạy bên trong một quy trình hệ điều hành.

Khi tiến trình chạy nhiều luồng, các luồng này chia sẻ bộ nhớ tiến trình (không gian địa chỉ) cả để đọc và viết.

JavaScript hỗ trợ Node.js được thiết kế đơn luồng. Mọi chức năng đều được đảm bảo để chạy đến khi hoàn thành và không có mã JavaScript nào khác trong quy trình hiện tại sẽ chạy trong khi chạy chức năng đó. Các sự kiện không đồng bộ tự nhiên (mạng, đầu vào đầu vào đĩa, bộ định thời, các sự kiện phần cứng và hệ điều hành khác) được xử lý bởi công cụ thêm các hàm JavaScript đã đăng ký làm trình xử lý (hoặc gọi lại) cho các sự kiện này vào hàng đợi vòng lặp sự kiện sẽ được thực thi sau các chức năng ở phía trước hàng đợi đã hoàn thành.

Trong mô hình đa luồng, hai hoặc nhiều luồng chạy mã song song, do đó, trong một hàm chạy một đoạn mã khác nhau cũng có thể chạy trên lõi xử lý khác, có thể đọc hoặc ghi vào cùng một địa chỉ bộ nhớ. Điều này có thể dẫn đến trạng thái không nhất quán của bộ nhớ trừ khi các cơ chế hệ điều hành đặc biệt (nguyên thủy đồng bộ hóa) được sử dụng bởi mã để quản lý quyền truy cập vào bộ nhớ dùng chung.



Câu trả lời 2:

Đây là một câu hỏi hay, có gì khác biệt giữa kiến ​​trúc hướng sự kiện của Node.js và lập trình đa luồng trong các ngôn ngữ khác?

Chúng ta có thể và nên phá vỡ điều này một chút.

  • Kiến trúc hướng sự kiện Node.

Kiến trúc hướng sự kiện không dành riêng cho Node, ví dụ: Tornado (Python), Vertx (Java), Akka (Scala), ReactiveX (nhiều ngôn ngữ).

  • Lập trình đa luồng trong các ngôn ngữ khác.

Lưu ý rằng JavaScript, theo thiết kế, không hỗ trợ nhiều luồng. Mặc dù nó hỗ trợ các webworkers, mà theo như tôi biết, có thể hoạt động như các luồng.

Vì vậy, hướng sự kiện không phải là duy nhất cho Node và đa luồng có thể được thực hiện trong Node.

Vì vậy, có thể có hai câu hỏi ở đây: Sự khác biệt về sự khác biệt giữa điều khiển sự kiện và đa luồng, và điều gì khác biệt giữa sự khác biệt giữa Node và các ngôn ngữ khác (khung). Tôi sẽ tập trung vào cái sau vì điều đó dường như là mục đích của câu hỏi.

Tôi nói rằng điều làm cho Node trở nên đặc biệt là tác giả đã tạo ra nó với mục đích tránh chặn IO khi xây dựng các ứng dụng web. Văn hóa của cộng đồng Node là nhấn mạnh và xây dựng dựa trên sức mạnh của IO không chặn. Bạn sẽ không tìm thấy quá nhiều thư viện bên thứ 3 thực hiện chặn cuộc gọi. Là một nhà phát triển sử dụng Node, bạn không có khả năng chạy vào các hoạt động chặn tinh tế trong mã của mình. Trong khi ở các ngôn ngữ khác, một nhà phát triển ngây thơ có thể vô tình thực hiện các cuộc gọi chặn không hiệu quả cao như đọc từ kết nối cơ sở dữ liệu.

Ngoài ra, bạn thực sự nên đọc về nhiều mô hình cho chương trình đồng thời, và hiểu những ưu và nhược điểm của từng mô hình. Điểm thưởng cho việc đánh giá cao tại sao đa luồng được chấp nhận trong một thời gian dài như vậy.



Câu trả lời 3:

sự khác biệt về khái niệm là khá dễ dàng để quấn quanh bạn.

Trong kiến ​​trúc hướng sự kiện, chương trình của bạn chạy trong một vòng đơn luồng liên tục (bạn có thể thực hiện một số luồng đa luồng trong nút nhưng không phải lo lắng về điều đó ngay bây giờ). Khi một sự kiện diễn ra, một công việc sẽ xuất hiện trong ngăn xếp cuộc gọi để được giải quyết tại các chương trình giải trí.

Kiến trúc đa luồng thường gửi một luồng mới khi nó phải chờ một hành động. Vì vậy, bạn thực hiện một cuộc gọi đến cơ sở dữ liệu và bạn tạo ra một luồng mới sẽ thực hiện tất cả những điều bạn cần và làm những gì bạn cần và kết luận hoặc nối lại chuỗi gốc.

Cả hai phương pháp này đều rất hữu ích cho những thứ khác nhau. Điều khiển sự kiện rất tốt cho giao diện người dùng và máy chủ vì chương trình của bạn không biết khi nào một sự kiện mới sẽ xảy ra và thường các sự kiện sẽ diễn ra theo đợt. Mặc dù phân luồng là cần thiết cho các công việc nặng tính toán, nơi bạn muốn chia nhỏ vấn đề thành nhiều phần nhỏ hơn (hoặc bạn đang tiến đến giới hạn của vòng lặp đơn luồng).