Quá trình, chủ đề và Async Ruby

Tram Ho

Thông dịch viên Ruby sử dụng một quy trình duy nhất theo thiết kế. Điều này có nghĩa là trên cpu 8 lõi hiện đại của bạn, tập lệnh của bạn sẽ chỉ sử dụng tối đa 1/8 sức mạnh xử lý của bạn. Trong bài viết này, chúng ta sẽ thấy nhiều hơn về ruby ​​đa luồng và đa quy trình.

Sử dụng nhiều chủ đề

Trình thông dịch ruby ​​Matz sử dụng GIL (Khóa phiên dịch toàn cầu), do đó nó chỉ cho phép một luồng chạy cùng một lúc. Vì vậy, trong các tác vụ ràng buộc cpu, không có lợi ích gì khi sử dụng đa luồng và nó sẽ không mang lại lợi ích gì cho bạn (trong ruby). Đầu tiên, chúng ta hãy lấy ví dụ này để tính số Fibonacci. Đó hoàn toàn là một nhiệm vụ ràng buộc cpu.

Bây giờ hãy chạy nó bằng 10 luồng.

Trên một thế giới lý tưởng, chúng tôi hy vọng sẽ tăng gấp 10 lần hiệu suất. Nhưng,

Vì vậy, lợi ích của việc sử dụng chủ đề là gì? Câu trả lời là, Không (nếu bạn đang cố gắng giải quyết vấn đề ràng buộc cpu). Nhưng, nếu bạn đang cố gắng giải quyết vấn đề bị ràng buộc IO, thì các luồng sẽ tăng tốc hiệu suất của bạn lên rất nhiều.

Ví dụ: Thực hiện các yêu cầu HTTP với nhiều luồng

Hãy tưởng tượng một kịch bản, trong đó chúng ta có một phương pháp kiểm tra xem nó có thể truy cập vào một số trang web và phản hồi lại bằng mã trạng thái HTTP hay không.

Bây giờ, hãy viết lại mã để sử dụng nhiều luồng để thực hiện công việc

Đó là một cải tiến lớn so với việc thực hiện luồng đơn của chúng tôi. Về mặt tích cực, việc chạy nhiều luồng không làm tăng mức độ sử dụng bộ nhớ như sử dụng đa tiến trình.

Những lợi ích

  1. Tăng tốc cho các hoạt động chặn
  2. Các biến có thể được chia sẻ / sửa đổi (beaware của deadlocks)
  3. Không sử dụng thêm bộ nhớ

Nhược điểm

  1. Khó gỡ lỗi hơn nhiều

Sử dụng nhiều quy trình

Hãy nhớ việc triển khai Wikipedia của chúng tôi từ phần #threads.

Bây giờ chúng ta sẽ thử chạy nó với nhiều tiến trình thay vì các luồng. Hàm viết lại sẽ là

Bây giờ, hãy xem điểm chuẩn.

Vì vậy, so với 40 giây, nó sử dụng 18 giây. Đó là một cải tiến tuyệt vời. Lưu ý sử dụng bộ nhớ

Việc thực hiện này đang sử dụng bộ nhớ cao hơn 10 lần. Đó là sự đánh đổi.

Những lợi ích

  1. Tăng tốc thông qua nhiều CPU
  2. Tăng tốc cho các hoạt động chặn
  3. Các biến được bảo vệ khỏi sự thay đổi
  4. Các tiến trình con bị giết khi tiến trình chính của bạn bị giết thông qua Ctrl + c hoặc giết -2

Nhược điểm

  1. Sử dụng bộ nhớ sẽ cao hơn.

Tóm lược

Nó được mô tả tốt nhất trong bài viết tuyệt vời này từ Eqbal Qur'an .

Để kết luận, chúng ta có thể nói, không có kết thúc nào là giải pháp tốt nhất. Chúng tôi phải hiểu khối lượng công việc và chọn giải pháp tốt nhất cho vấn đề của chúng tôi.

Những điều cần học

Kinh dị Async

Ruby không đồng bộ -by Samuel Williams

Mô hình lò phản ứng

Đá quý song song

GIL – Khóa phiên dịch toàn cầu

Không ai hiểu GIL

Đa xử lý trong ruby

Làm việc với các chủ đề trong ruby

Đá quý Async

Đá quý song song

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo