2016-08-06 34 views
0

Ich habe ein Objekt mit unterschiedlichen Eigenschaften in Nodejs, gibt es verschiedene Async-Funktion, die auf dieses Objekt mit einer komplexen Ausführung zugreifen und ändern. Eine einzelne asynchrone Funktion kann interne Callbacks (oder asynchrone Funktionen) haben, deren Ausführung einige Zeit in Anspruch nehmen kann. Diese Funktion ändert dann das Objekt. Ich möchte dieses Objekt sperren, bis ich mit allen Änderungen fertig bin, nur danach wird jede andere asynchrone Funktion darauf zugreifen.Wie sperrt man Objekte, die von mehreren asynchronen Methoden in nodejs geteilt werden?

Beispiel:

var machineList = {}; 
    function operation1(){ 
     waitForMachineList(); 
     //complex logic 
     //modification of machineList, some closure and callbacks functions and again modification of machineList 
      leaveFromMachineList(); 
    } 
    function operation2(){ 
     waitForMachineList(); 
     //complex logic 
     //modification of machineList, some closure and callbacks functions and again modification of machineList 
     leaveFromMachineList(); 
    } 
    function operation3(){ 
     waitForMachineList(); 
     //complex logic 
     //modification of machineList, some closure and callbacks functions and again modification of machineList 
      leaveFromMachineList(); 
    } 
    function operation4(){ 
     waitForMachineList(); 
     //complex logic 
     //modification of machineList, some closure and callbacks functions and again modification of machineList 
      leaveFromMachineList(); 
    } 

Angenommen Maschinenliste ist eine komplexe Aufgabe, und es gibt verschiedene Operationen an diesem Objekt durch unterschiedliche Methoden erfolgen async werden (operation1(), operation2(), ...), ihn zu ändern . Diese Operation wird in beliebiger Reihenfolge aufgerufen, und eine beliebige Anzahl von Zeitpunkten je Anfrage kommt vom Client. Jede Anfrage führt eine einzelne Operation aus.

Es gibt einige interne Schließfunktionen und Rückrufe (oder asynchrone Funktionen) in jeder Betriebsfunktion, es kann einige Zeit dauern. Aber ich möchte MachineList Objekt sperren, bis eine einzelne Operation abgeschlossen ist.

Am Anfang einer Operation möchte ich Objekt wie waitForMachineList() sperren und Sperre nach leaveFromMachineList() freigeben.

Also endlich möchte ich Sperrmechanismus in Nodejs implementieren. Genauso wie Critical Session in C++ und C# sperren.

Also bitte einige helfen, es in Nodejs zu implementieren? oder schlagen Sie mir ein beliebiges Knotenmodul vor, das ich dafür verwenden kann.

Antwort

1

Ich habe Locking mit async-lock Knotenmodul gemacht. Jetzt kann ich das Ziel erreichen, das in Frage steht.

Beispiel:

var AsyncLock = require('async-lock'); 
var lock = new AsyncLock(); 

function operation1() { 
    console.log("Execute operation1"); 
    lock.acquire("key1", function(done) { 
     console.log("lock1 enter") 
     setTimeout(function() { 
      console.log("lock1 Done") 
      done(); 
     }, 3000) 
    }, function(err, ret) { 
     console.log("lock1 release") 
    }, {}); 
} 

function operation2() { 
    console.log("Execute operation2"); 
    lock.acquire("key1", function(done) { 
     console.log("lock2 enter") 
     setTimeout(function() { 
      console.log("lock2 Done") 
      done(); 
     }, 1000) 
    }, function(err, ret) { 
     console.log("lock2 release") 
    }, {}); 
} 

function operation3() { 
    console.log("Execute operation3"); 
    lock.acquire("key1", function(done) { 
     console.log("lock3 enter") 
     setTimeout(function() { 
      console.log("lock3 Done") 
      done(); 
     }, 1) 
    }, function(err, ret) { 
     console.log("lock3 release") 
    }, {}); 
}operation1(); operation2(); operation3(); 

Output:

Execute operation1

lock1

operation2

Execute Execute eingeben operation3

lock1

Fertig

lock1

zu lösen

lock2

Getan lösen

lock2

lock2 eingeben lock3 eingeben

lock3 Getan

lock3 lösen