Pytanie Jaki jest najlepszy sposób odczytywania plików w aplikacji opartej na EventMachine?


Aby nie blokować reaktora, chciałbym czytać pliki asynchronicznie, ale nie znalazłem żadnego oczywistego sposobu na zrobienie tego przy pomocy EventMachine. Próbowałem kilku różnych podejść, ale żaden z nich nie miał racji:

  • Po prostu przeczytaj plik, zablokuje reaktor, ale co to jest, nie jest że wolno (chyba, że ​​jest to duży plik, a na pewno jest).
  • Otwórz plik do odczytu i przeczytaj fragment na każdym tiku (ale ile to przeczytać? Za dużo i to zablokuje reaktor, za mało, a czytanie będzie wolniejsze niż to konieczne).
  • EM.popen('cat some/file', FileReader) Czuje się naprawdę dziwnie, ale działa lepiej niż powyższe alternatywy. W połączeniu z LineAndTextProtocol szybko odczytuje linie.
  • EM.attach, ale nie znalazłem żadnych przykładów korzystania z niego, a jedyną rzeczą, którą znalazłem na liście mailingowej jest to, że jest przestarzałe na rzecz ...
  • EM.watch, których nie znalazłem przykłady, jak używać do czytania plików.

Jak czytasz pliki w pętli reaktora EventMachine?


12
2018-05-01 09:59


pochodzenie




Odpowiedzi:


EM.attach / watch nie może być używany w plikach, ponieważ opcja / epoll na deskryptorze pliku na dysku zawsze będzie zwracana do odczytu.

Ostatecznie zależy to od tego, co próbujesz zrobić. Jeśli jest to mały plik, po prostu File.read go. Jeśli jest większy, możesz z czasem czytać małe fragmenty. Na przykład EM :: FileStreamer robi to, aby wysłać duży plik przez sieć.

Innym częstym przypadkiem użycia jest ogłaszanie pliku i czytanie w nowych treściach po ich zmianie. Można to osiągnąć za pomocą pliku EM.watch_file: http://github.com/jordansissel/eventmachine-tail


6
2018-05-04 20:33



Zasadniczo chcę przeczytać kilka umiarkowanie dużych plików (do 10 Mb) równolegle i wyodrębnić fragment każdej linii. - Theo
Jeśli operacja, którą musisz wykonać, odbywa się w trybie per-line, to odczytanie wiersza pliku na każdym tiku wydaje się mieć największy sens. Dostaniesz korzyści ze wszystkich metod IO opartych na liniach Ruby, bloki zdarzeń będą najbardziej odzwierciedlały Twoją logikę biznesową, a wykonywanie mniej w każdym bloku oznacza po prostu, że tykanie nastąpi szybciej. - SFEley
Czytanie linii na każdym teście jest zbyt wolne, ponieważ spędzam czas w reaktorze czekając na IO i tego właśnie chcę uniknąć, chcę robić inne rzeczy (np. Przetwarzać linię) podczas oczekiwania na IO. - Theo