The goal of semaphore is to enable synchronization of concurrent R processes.
Implements named semaphores from the Boost C++ library. Semaphores are managed by the operating system, which is responsible for ensuring that this integer value can be safely incremented or decremented by multiple processes. Processes can also wait (blocking) for the value to become positive.
Works cross-platform, including Windows, MacOS, and Linux.
# Install the latest stable version from CRAN:
install.packages("semaphore")
# Or the development version from GitHub:
install.packages("pak")
::pak("cmmr/semaphore") pak
library(semaphore)
<- create_semaphore()
s print(s)
#> [1] "uUkKpNMbTVgaborHG4rH"
increment_semaphore(s)
decrement_semaphore(s, wait = 10) # wait up to ten seconds
#> [1] TRUE
decrement_semaphore(s, wait = FALSE) # return immediately
#> [1] FALSE
remove_semaphore(s)
#> [1] TRUE
Open two separate R sessions on the same machine.
Session 1 - Producer
library(semaphore)
<- 'mySemaphore'
s
create_semaphore(s)
# enable session 2 to output 'unblocked!' three times
increment_semaphore(s)
increment_semaphore(s)
increment_semaphore(s)
remove_semaphore(s)
Session 2 - Consumer
library(semaphore)
<- 'mySemaphore'
s
for (i in 1:3) {
# Block until session 1 increments the semaphore
decrement_semaphore(s, wait = TRUE)
# Do some work
message('unblocked!')
}
message('finished')