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

时间:2016-08-06 09:57:39

标签: javascript node.js asynchronous locking critical-section

我在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();
}

假设machineList是一个复杂对象,并且通过不同的异步方法(operation1()operation2(),...)对此对象进行了不同的操作以对其进行修改。这些操作以任何顺序被调用,并且根据请求的任何数量的时间来自客户端。每个请求都将执行单个操作。

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

在开始任何操作时,我想锁定waitForMachineList()之类的对象,并在leaveFromMachineList()之后释放锁定。

所以最后我想在nodejs中实现锁定机制。就像C ++中的Critical Session一样,锁定C#。

那么请有人帮忙在nodejs中实现它吗?或者建议我使用任何节点模块。

1 个答案:

答案 0 :(得分:4)

我使用async-lock节点模块完成了锁定。现在我可以实现提到的目标。

示例:

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();

输出:

执行operation1

lock1输入

执行operation2

执行operation3

lock1完成

lock1 release

lock2输入

lock2完成

lock2 release

lock3输入

lock3完成

lock3发布