Câu hỏi của tôi: loại ứng dụng nào đòi hỏi nhiều luồng thực thi đồng thời?
1) Thực tế là một ngôn ngữ "quy mô" có nghĩa là sẽ có ít cơ hội hơn để bạn bỏ ngôn ngữ đó khi mọi thứ trở nên phức tạp hơn. (Đây được gọi là khái niệm "Toàn bộ sản phẩm".) Nhiều người đang bỏ rơi Apache cho Nginx vì lý do này. Nếu bạn ở bất kỳ nơi nào gần với "giới hạn cứng" được áp đặt bởi chi phí trên luồng, bạn sẽ cảm thấy sợ hãi và bắt đầu suy nghĩ về cách vượt qua nó. Các trang web không bao giờ có thể dự đoán lưu lượng truy cập mà họ sẽ nhận được, vì vậy dành một chút thời gian để làm cho mọi thứ có thể mở rộng là hợp lý.
2) Một con goroutine cho mỗi yêu cầu chỉ là bắt đầu. Có rất nhiều lý do để sử dụng goroutines trong nội bộ.
- Hãy xem xét một ứng dụng web với 100 yêu cầu đồng thời, nhưng mỗi yêu cầu tạo ra 100 yêu cầu phụ trợ. Ví dụ rõ ràng là một công cụ tổng hợp công cụ tìm kiếm. Nhưng bất kỳ ứng dụng nào cũng có thể tạo ra những con khỉ đột cho từng "khu vực" trên màn hình, sau đó tạo chúng một cách độc lập thay vì tuần tự. Ví dụ: mỗi trang trên Amazon.com được tạo thành từ hơn 150 yêu cầu back-end, được lắp ráp chỉ dành cho bạn. Bạn không để ý vì chúng song song, không tuần tự và mỗi "khu vực" là dịch vụ web riêng.
- Xem xét bất kỳ ứng dụng nào mà độ tin cậy và độ trễ là tối quan trọng. Bạn có thể muốn mỗi yêu cầu đến sẽ loại bỏ một vài yêu cầu back-end và trả lại bất kỳ dữ liệu nào trở lại trước .
- Xem xét bất kỳ "khách hàng tham gia" được thực hiện trong ứng dụng của bạn. Thay vì nói "cho mỗi yếu tố, lấy dữ liệu", bạn có thể loại bỏ một loạt các con khỉ đột. Nếu bạn có một loạt các DB nô lệ để truy vấn, bạn sẽ kỳ diệu đi N thời gian nhanh hơn. Nếu bạn không, nó sẽ không chậm hơn.
đạt lợi nhuận giảm dần khi số lượng luồng / tiến trình lớn hơn nhiều so với số lõi vật lý
Hiệu suất không phải là lý do duy nhất để chia nhỏ chương trình thành CSP . Nó thực sự có thể làm cho chương trình dễ hiểu hơn và một số vấn đề có thể được giải quyết với ít mã hơn.
Như trong các slide được liên kết ở trên, có đồng thời trong mã của bạn là một cách để tổ chức vấn đề. Không có goroutines giống như không có cấu trúc dữ liệu Map / Dictonary / Hash trong ngôn ngữ của bạn. Bạn có thể nhận được mà không có nó. Nhưng một khi bạn có nó, bạn bắt đầu sử dụng nó ở mọi nơi và nó thực sự đơn giản hóa chương trình của bạn.
Trong quá khứ, điều này có nghĩa là "cuộn" chương trình đa luồng của riêng bạn. Nhưng điều này rất phức tạp và nguy hiểm - vẫn không có nhiều công cụ để đảm bảo bạn không tạo ra các cuộc đua. Và làm thế nào để bạn ngăn chặn một người duy trì trong tương lai phạm sai lầm? Nếu bạn xem các chương trình lớn / phức tạp, bạn sẽ thấy họ tiêu tốn rất nhiều tài nguyên theo hướng đó.
Vì đồng thời không phải là một phần hạng nhất của hầu hết các ngôn ngữ, các lập trình viên ngày nay có một điểm mù về lý do tại sao nó sẽ hữu ích cho họ. Điều này sẽ chỉ trở nên rõ ràng hơn khi mọi điện thoại và đồng hồ đeo tay hướng tới 1000 lõi. Đi tàu với một công cụ phát hiện cuộc đua tích hợp.