import mortice from 'mortice'import delay from 'delay'// the lock name & options objects are both optionalconst mutex = mortice()Promise.all([ (async () => { const release = await mutex.readLock() try { console.info('read 1') } finally { release() } })(), (async () => { const release = await mutex.readLock() try { console.info('read 2') } finally { release() } })(), (async () => { const release = await mutex.writeLock() try { await delay(1000) console.info('write 1') } finally { release() } })(), (async () => { const release = await mutex.readLock() try { console.info('read 3') } finally { release() } })()]) Copy
import mortice from 'mortice'import delay from 'delay'// the lock name & options objects are both optionalconst mutex = mortice()Promise.all([ (async () => { const release = await mutex.readLock() try { console.info('read 1') } finally { release() } })(), (async () => { const release = await mutex.readLock() try { console.info('read 2') } finally { release() } })(), (async () => { const release = await mutex.writeLock() try { await delay(1000) console.info('write 1') } finally { release() } })(), (async () => { const release = await mutex.readLock() try { console.info('read 3') } finally { release() } })()])
read 1 read 2 <small pause> write 1 read 3
Mutexes are stored globally reference by name, this is so you can obtain the same lock from different contexts, including workers.
When a mutex is no longer required, the .finalize function should be called to remove any internal references to it.
.finalize
import mortice from 'mortice'const mutex = mortice()// ...some time latermutex.finalize() Copy
import mortice from 'mortice'const mutex = mortice()// ...some time latermutex.finalize()
Example
Clean up
Mutexes are stored globally reference by name, this is so you can obtain the same lock from different contexts, including workers.
When a mutex is no longer required, the
.finalize
function should be called to remove any internal references to it.