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