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

问题描述 投票:3回答:1

我在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中实现它吗?或者建议我可以使用任何节点模块。

javascript node.js asynchronous locking critical-section
1个回答
8
投票

我使用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发布

lock2进入

lock2完成

lock2发布

lock3进入

lock3完成

lock3发布

© www.soinside.com 2019 - 2024. All rights reserved.