There are a few asynchronous concurrency primitives js:
Also see tests
deps:
npm i
run tests:
npm test
const Coroutines = [0, 1, 2, 3].map((n) => `coroutine ${n}`)
// Global variables
const b = new Barrier()
const c = new ColorLog()
;(async () => {
c.log(`Lock barrier`, Coroutines[0])
await b.Lock()
c.log(`Done`, Coroutines[0])
})()
;(async () => {
c.log(`Sleep 1s ...`, Coroutines[1])
await sleep(1)
b.UnLock()
c.log(`barrier UnLock was invoked :)`, Coroutines[1])
})()
// setup
const CoroutineS_NUMBER = 3
const Coroutines = [...Array(CoroutineS_NUMBER).keys()].map(
(n) => `coroutine ${n}`
)
const sleepTimes = [...Array(CoroutineS_NUMBER).keys()]
// Global variables
const m = new Mutex()
const c = new ColorLog()
const CreateWorker = (sleepTime, workerNumber) => async () => {
c.log(`Lock mutex`, Coroutines[workerNumber])
await m.Lock()
c.log(`In CS`, Coroutines[workerNumber])
c.log(`Sleep ${sleepTime}s ...`, Coroutines[workerNumber])
await sleep(sleepTime)
c.log(`Out CS`, Coroutines[workerNumber])
m.UnLock()
c.log(`mutex UnLock was invoked :)`, Coroutines[workerNumber])
c.log(`Done`, Coroutines[workerNumber])
}
;(async () => {
const promises = sleepTimes
// create workers
.map((sleepTime, workerNumber) => CreateWorker(sleepTime, workerNumber))
// execute workers
.map((worker) => worker())
// wait all tasks
await Promise.all(promises)
})()