Tôi đã xem xét khả năng xử lý song song/không đồng bộ của Ruby và đọc nhiều bài viết và bài đăng trên blog. Tôi đã xem qua EventMachine, Fibers, Revactor, Reia, v.v. Thật không may, tôi không thể tìm ra giải pháp đơn giản, hiệu quả (và không phải IO-blocking) cho trường hợp sử dụng rất đơn giản này:Xử lý đồng thời/xử lý đồng bộ Ruby (với trường hợp sử dụng đơn giản)
File.open('somelogfile.txt') do |file|
while line = file.gets # (R) Read from IO
line = process_line(line) # (P) Process the line
write_to_db(line) # (W) Write the output to some IO (DB or file)
end
end
là bạn có thể thấy, kịch bản nhỏ của tôi đang thực hiện ba hoạt động đọc (R), quá trình (P) & ghi (W). Giả sử - vì đơn giản - đó mỗi hoạt động có chính xác 1 đơn vị thời gian (ví dụ 10ms), do đó mã hiện tại sẽ làm điều gì đó như thế này (5 dòng):
Time: 123456789(15 units in total)
Operations: RPWRPWRPWRPWRPW
Nhưng, tôi muốn nó làm điều gì đó như thế này:
Time: 1234567 (7 units in total)
Operations: RRRRR
PPPPP
WWWWW
Rõ ràng, tôi có thể chạy ba quá trình (đọc, xử lý & nhà văn) và vượt qua đọc các dòng từ người đọc vào hàng đợi xử lý và sau đó vượt qua dòng chế biến thành hàng đợi nhà văn (tất cả điều phối thông qua ví dụ RabbitMQ) . Nhưng, trường hợp sử dụng rất đơn giản, nó không cảm thấy đúng.
Bất kỳ manh mối nào về cách thực hiện điều này (không chuyển từ Ruby sang Erlang, Closure hoặc Scala)?
Các bài viết có nên được gọi theo cùng thứ tự như khi được đọc không? –
Không, đó là toàn bộ vấn đề mà họ có thể hoàn toàn không đồng bộ. – Dim