如何锁定nodejs中多个异步方法共享的对象?

Nil*_*agh 4 javascript asynchronous locking critical-section node.js

我在nodejs中有一个具有不同属性的对象,还有不同的异步函数,这些函数通过一些复杂的执行来访问和修改该对象。单个异步函数可能具有内部回调(或异步函数),这可能需要一些时间才能执行,然后该函数将修改该对象。我想锁定该对象,直到完成所有修改,直到其他异步函数都可以访问它为止。

例:

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();
}
Run Code Online (Sandbox Code Playgroud)

假设machineList是一个复杂的对象,有不同的操作该对象由不同的异步方法上进行(operation1()operation2(),...)进行修改。这些操作可以按任何顺序调用,并且可以根据客户的请求按任意次数调用。每个请求将执行一个操作。

每个操作函数中都有一些内部闭包函数和回调(或异步函数),可能需要一些时间。但是我想锁定machineList对象,直到完成任何单个操作。

开始任何操作时,我都想像那样锁定对象,waitForMachineList()并在之后释放锁定leaveFromMachineList()

所以最后我想在nodejs中实现锁定机制。就像C ++中的关键会话并锁定C#一样。

因此,请一些人将有助于在nodejs中实现它?或建议我可以用于此的任何节点模块。

Nil*_*agh 11

我已经使用异步锁定节点模块完成了锁定。现在,我可以实现所提到的目标。

例:

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();
Run Code Online (Sandbox Code Playgroud)

输出:

执行操作1

lock1输入

执行操作2

执行操作3

lock1完成

lock1释放

lock2输入

lock2完成

lock2释放

lock3输入

lock3完成

lock3释放