2017-02-16 4 views
0

es sieht für mich aus wie ich ein Nebenläufigkeitsproblem in NodeJs haben. Mir ist bewusst, dass dies nicht möglich sein soll.Nodejs Filestream Nebenläufigkeit

Ich verarbeite Daten durch die Linie aus einer Datei und schreibe sie in eine andere Datei auch in Zeilen. In der Ausgabedatei merke ich, dass Zeilen überschrieben werden, was bedeutet, dass ich hin und wieder Zeilen in der Ausgabe sehe, die scheinbar auf halbem Wege von anderen Zeilen überschrieben werden. Ich lese die Daten aus einem Lesestream. es sieht ungefähr so ​​aus:

Gibt es irgendeine Möglichkeit dieses Schemas, das Schreibfehler produziert, oder muss ich woanders suchen?

+0

Was macht 'processLine()'? Ist es völlig synchron? Zu Ihrer Information, Sie können Ihren Code mit 'resting = line.pop()' vereinfachen. – jfriend00

+0

Beachten Sie auch, dass '.write()' einen booleschen Wert zurückgibt, der anzeigt, ob der Ausgabepuffer voll ist und Sie warten müssen, bis das 'drain'-Ereignis erneut beginnt zu schreiben. Siehe [doc] (https://nodejs.org/api/stream.html#stream_writable_write_chunk_encoding_callback). – jfriend00

+0

Vielleicht möchten Sie einen [transform stream] (http://codewinds.com/blog/2013-08-20-nodejs-transform-streams.html) verwenden und dann '.pipe()' verwenden, das alle behandelt Flusskontrolle für Sie. – jfriend00

Antwort

1

Dies scheint ein Pufferüberlaufproblem zu sein. Sie überlaufen wahrscheinlich den Schreibpuffer, beachten jedoch die Flusskontrolle nicht.

Sie können entweder einen Rückruf in .write() passieren und erst mit dem nächsten Schreib vorgehen, wenn dieser Rückruf aufgerufen wird, oder Sie können die Aufmerksamkeit auf den Rückgabewert von .write() zahlen und wenn es false zurückzugibt, Sie müssen dann für das drain Ereignis warten auf dem Strom vor dem Schreiben von mehr.

Ein anderer Ansatz wäre, eine transform stream zu schreiben und dann .pipe() zu verwenden und die Streaming-Infrastruktur die Flusskontrolle für Sie verwalten zu lassen.

+0

Transformer funktioniert wie Charme und viel weniger Quellcode .. Danke. – Thomas