2010-05-01 4 views
12

Um den Reaktor nicht zu blockieren, würde ich gerne Dateien asynchron lesen, aber ich habe keine offensichtliche Möglichkeit gefunden, dies mit EventMachine zu tun. Ich habe ein paar verschiedene Ansätze ausprobiert, aber keiner von ihnen fühlt sich richtig an:Was ist der beste Weg, um Dateien in einer EventMachine-basierten App zu lesen?

  • einfach die Datei lesen, wird es dem Reaktorblock, aber was solls, es ist nicht dass langsam (es sei denn, es ist ein großer ist Datei, und dann ist es definitiv).
  • Öffnen Sie die Datei zum Lesen und lesen Sie ein Stück auf jeden Tick (aber wie viel zu lesen? Zu viel und es wird den Reaktor zu blockieren, zu wenig und das Lesen wird langsamer als notwendig).
  • EM.popen('cat some/file', FileReader) fühlt sich wirklich komisch an, funktioniert aber besser als die obigen Alternativen. In Kombination mit der LineAndTextProtocol liest es Linien ziemlich schnell.
  • EM.attach, aber ich habe keine Beispiele gefunden, wie es zu benutzen, und das einzige, was ich auf der Mailing-Liste gefunden habe, ist, dass es für ...
  • veraltet ist
  • EM.watch, die ich gefunden habe, keine Beispiele für das Lesen von Dateien.

Wie lesen Sie Dateien in einer EventMachine-Reaktorschleife?

Antwort

6

EM.attach/watch kann nicht für Dateien verwendet werden, da select/epoll auf einer festplattenbasierten Dateibeschreibung immer lesbar ist.

Letztendlich hängt es davon ab, was Sie versuchen zu tun. Wenn es eine kleine Datei ist, einfach Datei.lesen Sie es. Wenn es größer ist, können Sie im Laufe der Zeit kleine Brocken lesen. Mit EM :: FileStreamer wird beispielsweise eine große Datei über das Netzwerk gesendet.

Ein weiterer häufiger Anwendungsfall ist es, eine Datei zu markieren und neue Inhalte einzulesen, wenn sie sich ändert. Dies kann mit EM.watch_file erreicht werden: http://github.com/jordansissel/eventmachine-tail

+0

Grundsätzlich möchte ich ein paar mäßig große Dateien (bis zu 10 MB) parallel lesen und ein Stück von jeder Zeile extrahieren. – Theo

+0

Wenn die Operation, die Sie durchführen müssen, per-line ist, dann scheint das Lesen einer Zeile der Datei bei jedem Tick am sinnvollsten zu sein. Sie profitieren von allen zeilenbasierten IO-Methoden von Ruby, Ihre Ereignisblöcke würden Ihre Geschäftslogik am ehesten widerspiegeln und weniger in jedem Block bedeuten, dass die Ticks schneller ablaufen. – SFEley

+0

Das Lesen einer Zeile bei jedem Tick ist zu langsam, weil ich Zeit im Inneren des Reaktors verbringe und auf IO warte. Und genau das möchte ich vermeiden. Ich möchte andere Dinge tun (wie die Linie bearbeiten), während ich auf IO warte. – Theo

Verwandte Themen