2016-05-25 13 views
0

Unten ist ein Stück Code:Zugriff auf globale Variablen in setImmediate in node.js

var buffer = new Buffer(0, 'hex'); //Global buffer 
socket.on('data', function(data) { 
    // Concatenate the received data to buffer 
    buffer = Buffer.concat([buffer, new Buffer(data, 'hex')]); 
    setImmediate(function() { // Executed asynchronously 
    /*Process messages received in buffer*/ 
    var messageLength = getMessageLength(buffer); 
    while (buffer.length >= messageLength) { 
     /*Process message and send response*/ 
    } 
    //Remove message from buffer after processing is done 
    buffer.splice(messageLength); 
    }) // End of setImmediate 
}) //End of socket.on 

ich eine globale Variable 'Puffer' verwende, innerhalb des setImmediate Block (ausgeführt asynchron). Gibt es eine Garantie, dass sich die globale Puffervariable während der Ausführung des Codes im setImmediate-Block nicht ändert (entweder durch Hinzufügen von Daten oder Löschen von Daten)? Wenn nein, wie geht man damit um, dass auf den Puffer sicher zugegriffen wird ??

+0

Was ist dein Problem? Sie möchten, dass der Puffer sicher ist (Puffer wird nicht vom äußeren Programm benutzt), wenn setImmediate aufgerufen wird? Wenn setImmediate func body sync ist, müssen Sie sich keine Gedanken darüber machen, javascript ist single thread. Wenn setImmediate func body async ist, verwenden Sie die closure-Variable statt der globalen. –

Antwort

0

Das oft wiederholte Sprichwort "NodeJS ist single-threaded" bedeutet, dass hier von "Sicherheit" keine Rede sein kann. Gleichzeitige Zugriffe auf eine Variable sind nicht möglich, da keine simultanen Operationen stattfinden. Auch wenn der Code setImmediate asynchron ausgeführt wird, heißt das nicht, dass er als GLEICHZEIT ausgeführt wird. Es bedeutet nur, dass es "bald" ausgeführt wird. Die übergeordnete Funktion kann zurückgeben, bevor dies geschieht - aber die übergeordnete Funktion wird nicht ausgeführt, wenn der anonyme Rückruf setImmediate ausgelöst wird. Zu dieser Zeit läuft nur der Callback.

Diese Operationen sind also sicher - aber für was es sich lohnt, ist es nicht sehr effizient. NodeJS-Puffer haben eine feste Länge, weshalb Sie immer wieder eine neue zuweisen müssen, um Daten anzufügen. Sie sind für einmalige Lasten geeignet, aber nicht ideal für konstante Append-Operationen. Erwägen Sie die Verwendung eines lesbaren Streams. Auf diese Weise können Sie beliebige Datenlängen gleichzeitig abrufen und verarbeiten und einen Puffer zurückgeben. Aber intern reserviert es seinen Speicherblock nicht ständig neu für das Lesen der Daten.