node.js 事件同步锁
code
由于AsyncLock无法在线程间传递,所以使用事件代替线程,模拟线程间同步:
import AsyncLock from 'async-lock';
var lock = new AsyncLock();
function main() {
setTimeout(() => task(1), 1000);
setTimeout(() => task(2), 1000);
setTimeout(() => task2(3), 1000);
setTimeout(() => task2(4), 1000);
}
async function task(threadId) {
console.log('线程启动: ' + threadId);
await lock.acquire('a', async () => {
await sleep(2000);
console.log(threadId + '工作完毕');
});
console.log('释放' + threadId);
}
async function task2(threadId) {
console.log('线程启动: ' + threadId);
await sleep(2000);
console.log(threadId + '工作完毕');
console.log('释放' + threadId);
}
function sleep(n) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(null);
}, n);
});
}
main();
输出是:
线程启动: 1
线程启动: 2
线程启动: 3
线程启动: 4
1工作完毕
释放1
3工作完毕
释放3
4工作完毕
释放4
2工作完毕
释放2