padlock中文文档|padlock js中文教程|解析
挂锁
挂锁不是一个同步库。挂锁不会阻塞。
挂锁用于在处理异步回调时有选择地防止冲突/中断代码执行。调用带锁的函数以在获得锁后立即执行它,并在所有可能的回调端点解锁它。对您不想中断的其他函数使用相同的锁,并留下您不介意中断锁的函数。锁定的函数将按顺序执行,因为在释放锁时可以获得锁。
为什么
我写这个是为了处理WATCH -> GET -> MULTI ... values using the GET ... EXEC
场景中的node_redis 。我反复遇到在WATCH
和之间发生的其他功能的问题,这些功能MULTI
会发送命令并中断我的WATCH
. 我与作者确认这是他计划解决的已知问题。与此同时,我写了这个来WATCH
在EXEC
回调中使用will lock 和 unlock 的任何函数中使用。我相信你可以在任何需要将某些冲突函数排除在特定回调链之外的地方使用它。
我可以用异步库做到这一点吗?也许吧,但我发现使用这种方法会消除事件队列语言的优势。
最大的优点是不使用你的锁的函数不会被你的锁回调中断。也就是说,你在锁定期间可能有很多事件和函数在执行,但是只要你有选择地使用你的锁定,node.js 就不会等待你的锁定释放来运行无关代码。这与来自 node.js 的一些(也许是全部?)同步库有很大不同,并且应该让您的服务快速运行,尽管半同步地等待回调。
安装
npm install padlock
方法
lockid = Padlock.acquire(callback, args, ctx, timeout)
(ctx & timeout 可选) 获取锁或排队函数。永远不会,但如果锁定不成功,则会将回调排队,与 runwithlock() 不同。
Padlock.runwithlock(callback, args, ctx, timeout)
(ctx 和 timeout 可选)获取锁并运行回调或将失败的锁上的回调排队。如果初始锁定尝试成功,将执行回调,与获取不同。
bool = Padlock.islocked()
检查当前是否已获取锁。
Padlock.release(lockid)
(lockid 是可选的)取消锁定。可以以当前锁为 lockid 为条件。
Padock.require(callback, ctx, timeout)
(ctx 和 timeout 可选)在运行前获取锁的函数中包装函数调用。
活动
Padlock 实例是一个 EventEmitter。您可以订阅与事件Padlock.on(...)
,Padlock.once(...)
等等。
以下是事件(这些都将 lockid 作为参数传递):
locked
— 在获取锁时发送。
unlocked
— 在释放锁时发送(警告,在您收到此事件时可能尚未解锁)
timeout
– 在超时时间内未释放锁时调用。此时您可能希望在调用 时使用 lockid 参数释放锁release
。
例子
乱序
var Padlock = require("padlock").Padlock;
var lock = new Padlock();
//a set of functions where one is asynchronous and could get out of order
console.log("start");
setTimeout(function() {
console.log("middle");
}, 200);
console.log("end");
开始
结束
中间
确保秩序
lock.runwithlock(function () {
console.log("start");
lock.release();
});
lock.runwithlock(setTimeout, [function() {
console.log("middle");
lock.release();
}, 200]);
lock.runwithlock(function () {
console.log("end");
lock.release();
});
开始
中间
结束
用锁要求替换函数
function logit(x) {
console.log(x);
lock.release();
}
logit = lock.require(logit);
logit("a");
lock.acquire(setTimeout, [function() {
console.log("b");
lock.release();
}, 200]);
logit("c");
logit("the end!");
a
b
c
结束!
执照
由内森弗里茨撰写。版权所有 © 2011 &yet, LLC。根据 MIT 许可条款发布:
特此授予任何人免费获得本软件和相关文档文件(“软件”)副本的许可,不受限制地处理本软件,包括但不限于使用、复制、修改、合并的权利、发布、分发、再许可和/或销售本软件的副本,并允许向其提供本软件的人员这样做,但须符合以下条件:
上述版权声明和本许可声明应包含在本软件的所有副本或重要部分中。
该软件“按原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于适销性、特定用途的适用性和不侵权的保证。在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任承担责任,无论是在合同诉讼、侵权行为或其他方面,由软件或软件的使用或使用或其他原因引起的或与之相关的软件。