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