2010-05-01 43 views
12

Để không chặn lò phản ứng, tôi muốn đọc tệp không đồng bộ, nhưng tôi đã không tìm thấy cách nào rõ ràng để thực hiện việc này bằng EventMachine. Tôi đã thử một vài phương pháp khác nhau, nhưng không ai trong số họ cảm thấy đúng:Cách tốt nhất để đọc tệp trong ứng dụng dựa trên EventMachine là gì?

  • Chỉ cần đọc các tập tin, nó sẽ chặn các lò phản ứng, nhưng cái quái gì, nó không phải rằng chậm (trừ khi đó là một lớn và sau đó chắc chắn là).
  • Mở tập tin để đọc và đọc một đoạn trên mỗi tick (nhưng bao nhiêu để đọc? Quá nhiều và nó sẽ chặn các lò phản ứng, quá ít và đọc sẽ nhận được chậm hơn so với cần thiết).
  • EM.popen('cat some/file', FileReader) cảm thấy thực sự kỳ lạ, nhưng hoạt động tốt hơn so với các lựa chọn thay thế ở trên. Kết hợp với các LineAndTextProtocol nó đọc dòng khá nhanh chóng.
  • EM.attach, nhưng tôi đã không tìm thấy bất kỳ ví dụ về cách sử dụng nó, và điều duy nhất tôi đã tìm thấy trên các mailing list là nó phản đối ủng hộ ...
  • EM.watch, mà tôi đã không tìm thấy ví dụ về cách sử dụng để đọc tệp.

Làm thế nào để bạn đọc tệp trong vòng lặp lò phản ứng EventMachine?

Trả lời

6

EM.attach/đồng hồ không thể được sử dụng trên các tập tin, như chọn/epoll trên một mô tả tập tin trên ổ đĩa sẽ luôn luôn trở lại có thể đọc được.

Cuối cùng, nó phụ thuộc vào những gì bạn đang cố gắng làm. Nếu đó là một tập tin nhỏ, chỉ cần File.read nó. Nếu nó lớn hơn, bạn có thể đọc các đoạn nhỏ theo thời gian. Ví dụ, EM :: FileStreamer thực hiện điều này để gửi tệp lớn qua mạng.

Một use-case phổ biến là một cái đuôi tập tin và đọc bằng nội dung mới khi nó thay đổi. Điều này có thể đạt được bằng EM.watch_file: http://github.com/jordansissel/eventmachine-tail

+0

Về cơ bản tôi muốn đọc một vài tác phẩm khá lớn (lên đến 10 Mb) song song và trích xuất một mảnh của mỗi dòng. – Theo

+0

Nếu thao tác bạn cần thực hiện là trên mỗi dòng, sau đó đọc một dòng của tệp trên mỗi đánh dấu có vẻ hợp lý nhất. Bạn sẽ nhận được lợi ích của tất cả các phương thức IO dựa trên dòng của Ruby, các khối sự kiện của bạn sẽ phản ánh chặt chẽ nhất logic nghiệp vụ của bạn và làm ít hơn trong mỗi khối đơn giản nghĩa là các bọ ve sẽ xảy ra nhanh hơn. – SFEley

+0

Đọc một dòng trên mỗi đánh dấu là quá chậm vì tôi dành thời gian bên trong lò phản ứng chờ IO, và đó là những gì tôi muốn tránh, tôi muốn làm những việc khác (như xử lý dòng) trong khi chờ IO. – Theo

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