Aaron Patterson (@tenderlove) sử dụng một ví dụ gần như chính xác như của bạn để mô tả chính xác lý do tại sao bạn có thể và nên đề sử dụng để đạt được đồng thời trong tình huống của bạn.
Hầu hết các thư viện I/O hiện đủ thông minh để giải phóng GVL (Khóa máy ảo toàn cầu hoặc hầu hết mọi người biết nó là GIL hoặc Khóa thông dịch toàn cục) khi thực hiện IO. Có một cuộc gọi hàm đơn giản trong C để thực hiện việc này. Bạn không cần phải lo lắng về mã C, nhưng đối với bạn điều này có nghĩa rằng hầu hết các thư viện IO trị giá muối của họ sẽ giải phóng GVL và cho phép các chủ đề khác thực thi trong khi luồng đang làm IO đợi dữ liệu trả về .
Nếu những gì tôi vừa nói là khó hiểu, bạn không cần phải lo lắng quá nhiều. Điều chính bạn cần biết là nếu bạn đang sử dụng một thư viện phong nha để thực hiện các yêu cầu HTTP của bạn (hoặc bất kỳ hoạt động I/O nào khác cho vấn đề đó ... cơ sở dữ liệu, giao tiếp interprocess, bất cứ điều gì), trình thông dịch Ruby (MRI) đủ thông minh để có thể giải phóng khóa trên trình thông dịch và cho phép các luồng khác thực thi trong khi một luồng đang chờ IO trả về. Nếu chuỗi tiếp theo có IO riêng của nó để lấy, trình thông dịch Ruby sẽ làm điều tương tự (giả sử rằng thư viện IO được xây dựng để sử dụng tính năng này của Ruby, mà tôi tin rằng hầu hết là những ngày này).
Vì vậy, để tóm tắt những gì tôi đang nói, hãy sử dụng chuỗi! Bạn sẽ thấy lợi ích hiệu suất. Nếu không, hãy kiểm tra xem liệu thư viện http của bạn có đang sử dụng hàm rb_thread_blocking_region() trong C và, nếu không, hãy tìm hiểu tại sao không. Có thể có lý do chính đáng, có thể bạn cần xem xét sử dụng thư viện tốt hơn.
Các liên kết đến video Aaron Patterson là ở đây: http://www.youtube.com/watch?v=kufXhNkm5WU
Đó là giá trị một chiếc đồng hồ, ngay cả khi chỉ cho cười, như Aaron Patterson là một trong những người hài hước trên internet.
Nguồn
2013-04-24 20:57:39
Vì vậy, bất kỳ ai cũng có thể tự nhận xét về sợi? Tôi có đúng trong giả định rằng các sợi không có quyền hạn "làm công cụ trong nền" không? –