gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 22:59:05 24 4
gpt4 key购买 nike

我在 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 中实现它?或建议我可以用于此的任何 Node 模块。

最佳答案

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

例子:

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

输出:

执行操作1

锁1进入

执行操作2

执行操作3

锁定 1 完成

锁1释放

锁2进入

锁2完成

锁2释放

锁3进入

lock3 完成

锁3释放

关于javascript - 如何锁定由nodejs中的多个异步方法共享的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38802959/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com