npm install posix-semaphore
Opens a new or an already existing semaphore with sem_open
. Fails with an error if the semaphore could not be opened or acquired.
semName
: name of the semaphoreoptions
:create
: If true, create the semaphore if it doesn't exist. Otherwise just try to open an already existing one. Default : truemask
: Bit mask string to be used on semaphore creation (it's affected by the user umask). Default : "0644". Example : "600".value
: Initial value of semaphore. Default : 1retryOnEintr
: Ifsem_wait
fails withEINTR
(usually it's due to a SIGINT signal being fired on CTRL-C), try to acquire the lock again. Default : falsedebug
: Prints useful information. Default : falsecloseOnExit
: If true, the semaphore will be closed on process exit (uncaughtException, SIGINT, normal exit). Default : true
The call will block until the semaphore is acquired by the process (will happen instantly if no other process acquired the lock). Calls sem_wait
under the hood.
The call will not block if the semaphore can't be acquired by the process. Calls sem_trywait
under the hood.
Releases the semaphore if it had been acquired, allowing other processes to acquire the lock. Calls sem_post
under the hood.
Closes and unlinks the semaphore, meaning that other processes will no longer have access to it. Calls sem_close
and sem_unlink
under the hood.
const Semaphore = require('posix-semaphore')
const sem = new Semaphore('mySemaphore')
sem.wait()
/* my code using shared resources ๐ */
sem.post()
// other processes are now free to use the resources
// remove the semaphore from the system
sem.close()
const Semaphore = require('posix-semaphore')
const sem = new Semaphore('mySemaphore')
try {
sem.tryWait()
/* my code using shared resources ๐ */
sem.post()
// other processes are now free to use the resources
} catch (e) {
console.error(e)
} finally {
// close and remove the semaphore from the system
sem.close()
}
const cluster = require('cluster')
const Semaphore = require('posix-semaphore')
const shm = require('shm-typed-array')
function parentProcess () {
const semParent = new Semaphore('mySemaphore', { debug: true })
const bufParent = shm.create(4096)
// we get the lock
semParent.wait()
// we create the child process
const child = cluster.fork({ SHM_KEY: bufParent.key })
// we write some data to the shared memory segment
bufParent.write('hi there :)')
// we release the lock
semParent.post()
// we close the child after a second
setTimeout(() => { child.kill('SIGINT') }, 1000)
}
function childProcess () {
const semChild = new Semaphore('mySemaphore', { debug: true })
const shmKey = parseInt(process.env.SHM_KEY)
const bufChild = shm.get(shmKey)
// we get the lock, will block until the parent has released
semChild.wait()
// should print 'hi there :)'
console.log(bufChild.toString())
}
if (cluster.isMaster) {
parentProcess()
} else if (cluster.isWorker) {
childProcess()
}
Output:
$ node test.js
hi there :)
shm segments destroyed: 1
$