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 derLineAndTextProtocol
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?
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
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
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