2012-07-08 23 views
6

Như tôi đã biết, Ruby 1.9 sử dụng các luồng hệ điều hành nhưng chỉ có một luồng vẫn thực sự chạy đồng thời (mặc dù một luồng có thể đang chặn IO trong khi một luồng khác đang xử lý). Các ví dụ luồng tôi đã thấy chỉ sử dụng Thread.new để khởi chạy một chuỗi mới. Đến từ một nền tảng Java, tôi thường sử dụng các nhóm luồng để không khởi chạy nhiều luồng mới vì chúng là "nặng".Ruby 1.9 thread pools

Có cấu trúc hồ bơi được xây dựng thành ruby ​​không? Tôi không thấy một trong các thư viện ngôn ngữ mặc định. Hoặc là có một viên đá quý tiêu chuẩn thường được sử dụng? Kể từ khi hệ điều hành cấp luồng là một tính năng mới hơn của ruby, tôi không biết làm thế nào trưởng thành các thư viện được cho nó.

Trả lời

6

Bạn chính xác trong đó trình thông dịch C Ruby mặc định chỉ thực hiện một luồng tại một thời điểm (các ngôn ngữ động dựa trên C khác như Python có các hạn chế tương tự). Bởi vì hạn chế này, luồng không thực sự phổ biến trong Ruby và kết quả là không có thư viện threadpool mặc định. Nếu có các nhiệm vụ được thực hiện song song, mọi người thường sử dụng các quy trình vì các quy trình có thể mở rộng trên nhiều máy chủ.

Nếu bạn cần sử dụng chủ đề, tôi khuyên bạn nên sử dụng https://github.com/meh/ruby-threadpool trên nền tảng JRuby, một trình thông dịch Ruby chạy trên JVM. Điều đó sẽ được ngay lên hẻm của bạn, và bởi vì nó đang chạy trên máy ảo nó sẽ có luồng thực sự.

+0

Cảm ơn. Tôi không thực sự có một trường hợp sử dụng ngay bây giờ, nhưng như tôi đã đọc cuốn sách cuốc, đây là một cái gì đó tôi không chắc chắn, nhưng bạn đã làm rõ. –

+12

Tôi không hiểu trong khi mọi người đề cập rằng các chủ đề là vô dụng trong Ruby vì chúng không chạy đồng thời. Chúng thực sự vô dụng đối với các nhiệm vụ ràng buộc CPU nhưng chúng có thể rất hữu ích đối với bất kỳ IO chặn nào mà bạn muốn thực hiện song song. Ví dụ. yêu cầu HTTP đồng thời. – Kamchatka

+0

Cảm ơn nhận xét. Tôi cần phải làm rõ thêm rằng các chủ đề không phải là vô ích trong Ruby, chỉ cần mọi người cần phải nhận thức được giới hạn của GIL vì các chủ đề không phải là không có phí. Đối với IO không chặn, cuộc gọi không đồng bộ dựa trên sự kiện C có thể phù hợp hơn. Xem http://blog.gregweber.info/posts/2011-06-16-high-performance-rb-part3 để biết thêm thông tin. – Wulfram

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