process-key-mutex
v1.0.1
Published
process key locker
Downloads
21
Readme
Process-Key-Mutex
基于当前进程内存,对当前进程内同一个key绑定的函数执行进行加锁操作.
- 多个方法绑定同个key的话,同个时间只会执行一个,其他的按照绑定时间顺延执行.
- 实现方式: Promise & 链表
使用方式:
let mutex = require('process-key-mutex');
console.log(
await mutex.lock('mutexKey', async() => {
await new Promise(resolve => setTimeout(() => resolve(), 1000));
return 'hi';
})
)
// hi
测试样例:
const assert = require('assert');
let mutex = require('process-key-mutex');
describe('#basic', function () {
it('[promise.all]', async function() {
this.timeout(100000000);
let [l1, l2] = await Promise.all([
func('func1', 200),
func('func2', 100),
])
assert(l1 == 'func1' && l2 == 'func2', `promise.all failed`);
});
it('promise && setTimeout', async function() {
this.timeout(100000000);
let [l1, l2, l3, l4] = await new Promise(resolve => {
let result = [];
setTimeout(async () => {
func('func3', 2000).then(l => result.push(l));
func('func4', 1000).then(l => result.push(l));
}, 1000)
func('func1', 2000).then(l => result.push(l));
func('func2', 1000).then(l => result.push(l));
setInterval(() => {
if (result.length == 4) resolve(result)
}, 1000)
})
assert(l1 == 'func1' && l2 == 'func2' && l3 == 'func3' && l4 == 'func4', `promise && setTimeout failed`);
});
it('immediately && setTimeout', async function() {
this.timeout(100000000);
let [l1, l2] = await new Promise(async(resolve) => {
let result = [];
result.push(await func('func1', 4000));
setTimeout(async () => {
func('func2', 2000).then(l => result.push(l));
}, 1000)
setInterval(() => {
if (result.length == 2) resolve(result)
}, 1000)
})
assert(l1 == 'func1' && l2 == 'func2', `immediately && setTimeout failed`);
});
it('[one of throw error]', async function() {
this.timeout(100000000);
let [l1, l2] = await new Promise(resolve => {
let result = [];
func('func1', 2000).then(l => result.push(l));
funcErr('func2', 1000).then(l => result.push(l)).catch(error => result.push(error));
setInterval(() => {
if (result.length == 2) resolve(result)
}, 1000)
})
assert(l1 == 'func1' && l2 instanceof Error, `one of throw error failed`);
});
})
let func = async (label, delay) => {
return mutex.lock('func', async() => {
//console.log(`execute func: ${label}`);
await new Promise(resolve => setTimeout(() => resolve(), delay));
//console.log(`func: ${label} done`);
return label;
})
}
let funcErr = async (label, delay) => {
return mutex.lock('func', async() => {
//console.log(`execute func: ${label}`);
throw new Error('error');
})
}