if (juliaSetupOk() && Sys.getenv("NOT_CRAN") == "true") {
library(JuliaConnectoR)
library(future)
# 1) Start a shared Julia TCP server in the main R session, which may use all CPU threads
Sys.setenv("JULIA_NUM_THREADS" = parallel::detectCores())
stopJulia() # stop current Julia connection before starting server
startJuliaServer()
# 2) Create R workers
cl <- parallelly::makeClusterPSOCK(workers = 2)
# 3) Warm-up R workers, load Julia and execute first Julia function
# (In practice, you could, e.g., trigger Julia pre-compilation here.)
parallel::clusterEvalQ(cl, {
library(JuliaConnectoR)
JuliaConnectoR::juliaEval("1") # open Julia TCP connection on each worker
})
## 4) Re-Use those warmed workers for use via futures
plan(cluster, workers = cl)
## 5) Create a global variable for demonstration purposes (and stay thread safe)
juliaEval("global const counter = Threads.Atomic{Int}(0)")
incrementCounter <- function() {
JuliaConnectoR::juliaEval("Threads.atomic_add!(counter, 1)")
}
## 6) Execute futures via worker-pool
f1 <- future({incrementCounter()})
f2 <- future({incrementCounter()})
value(f1)
value(f2)
# Reading the value should demonstrate that the
# global variable is shared across workers.
juliaEval("counter[]")
## 7) Cleanup
plan(sequential)
parallel::stopCluster(cl)
stopJulia()
}
# \dontshow{
JuliaConnectoR:::stopJulia()
# }
Run the code above in your browser using DataLab