Vì vậy, để trả lời câu hỏi đầu tiên và thứ hai của bạn:
Tính năng không chặn cũng giống như không đồng bộ - bạn thực hiện cuộc gọi và bạn sẽ nhận được kết quả sau đó, nhưng trong khi điều đó xảy ra, bạn có thể làm điều gì đó khác. Chặn thì ngược lại. Bạn chờ cuộc gọi quay lại trước khi tiếp tục hành trình.
Giờ đây, mã Async / Non-block nghe có vẻ tuyệt vời và đúng như vậy. Nhưng tôi có lời cảnh báo. Không chặn / Không chặn rất tuyệt vời khi làm việc trong môi trường hạn chế, chẳng hạn như trong điện thoại di động ... hãy xem xét CPU / bộ nhớ hạn chế. Nó cũng tốt cho phát triển front-end, nơi mã của bạn cần phản ứng với tiện ích giao diện người dùng theo một cách nào đó.
Không đồng bộ là cơ bản đối với cách tất cả các hệ điều hành cần hoạt động - chúng sẽ giúp bạn hoàn thành công việc ở chế độ nền và đánh thức mã của bạn khi chúng đã thực hiện những gì bạn yêu cầu và khi cuộc gọi đó không thành công, bạn đã nói là không. hoạt động bởi một ngoại lệ hoặc một số loại mã trả lại / đối tượng lỗi.
Tại thời điểm khi mã của bạn yêu cầu điều gì đó sẽ mất một lúc để trả lời, hệ điều hành của bạn biết rằng nó có thể bận rộn với việc làm những thứ khác. Mã của bạn - một quy trình, chuỗi hoặc tương đương, các khối. Mã của bạn hoàn toàn không biết về những gì khác đang diễn ra trong Hệ điều hành trong khi chờ kết nối mạng đó được thực hiện hoặc trong khi chờ phản hồi đó từ một yêu cầu HTTP hoặc trong khi chờ đọc / ghi tệp đó, và Sớm. Mã của bạn có thể "đơn giản là" đang chờ một cú nhấp chuột. Điều thực sự đang diễn ra trong thời gian đó là hệ điều hành của bạn đang quản lý, lập lịch và phản ứng liên tục với các "sự kiện" - những thứ mà hệ điều hành đang tìm kiếm, chẳng hạn như quản lý bộ nhớ, I / O (bàn phím, chuột đĩa, internet), các tác vụ khác, khôi phục lỗi, v.v.
Hệ điều hành là lõi cứng. Họ thực sự giỏi trong việc ẩn tất cả những thứ phức tạp về không đồng bộ / không chặn khỏi bạn lập trình viên. Và đó là cách hầu hết các lập trình viên đạt được vị trí của chúng ta ngày nay với phần mềm. Bây giờ chúng ta đang đạt đến giới hạn CPU, mọi người đang nói rằng mọi thứ có thể được thực hiện song song để cải thiện hiệu suất. Điều này có nghĩa là Async / non-block dường như là một điều rất thuận lợi để làm và vâng, nếu phần mềm của bạn yêu cầu, tôi có thể đồng ý.
Nếu bạn đang viết một máy chủ web back-end thì hãy tiến hành một cách thận trọng. Hãy nhớ rằng bạn có thể mở rộng theo chiều ngang với giá rẻ hơn nhiều. Netflix / Amazon / Google / Facebook là những trường hợp ngoại lệ rõ ràng đối với quy tắc này, hoàn toàn là vì nó rẻ hơn khi họ sử dụng ít phần cứng hơn.
Tôi sẽ cho bạn biết tại sao mã không đồng bộ / không chặn lại là cơn ác mộng với các hệ thống back-end ....
1) Nó trở thành một sự từ chối dịch vụ về năng suất ... bạn phải suy nghĩ RẤT NHIỀU hơn, và bạn mắc rất nhiều sai lầm trong quá trình làm việc.
2) Dấu vết ngăn xếp trong mã phản ứng trở nên không thể giải mã - thật khó để biết cái gì được gọi là gì, khi nào, tại sao và như thế nào. Chúc may mắn với việc gỡ lỗi.
3) Bạn phải suy nghĩ nhiều hơn về việc mọi thứ thất bại như thế nào, đặc biệt là khi nhiều thứ trở lại không đúng như cách bạn đã gửi chúng. Trong thế giới cũ, bạn đã làm từng việc một.
4) Khó hơn để kiểm tra.
5) Khó duy trì hơn.
6) Thật đau đớn. Lập trình phải là một niềm vui và niềm vui. Chỉ những kẻ tự bạo mới thích sự đau đớn. Những người viết các khuôn khổ đồng thời / phản ứng là những kẻ tàn bạo.
Và có, tôi đã viết cả đồng bộ và không đồng bộ. Tôi thích đồng bộ hơn vì 99,99 ứng dụng back-end có thể sử dụng với mô hình này. Các ứng dụng front-end cần mã phản ứng, không cần câu hỏi và đó luôn là cách.
Có, mã có thể không đồng bộ, không chặn VÀ dựa trên sự kiện.
Điều quan trọng nhất trong lập trình là đảm bảo mã của bạn hoạt động và phản hồi trong một khoảng thời gian có thể chấp nhận được. Hãy tuân thủ nguyên tắc quan trọng đó và bạn không thể sai lầm.