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释放
| 归档时间: |
|
| 查看次数: |
7070 次 |
| 最近记录: |