run()
for CallrFuture
would update the RNG
state, because callr::r_bg()
, used to launch the future,
does so. This would compromise numeric reproducibility, where the
callr
future backend would not give the same random numbers
as other future backends. Now run()
launches the future in
stealth RNG mode, i.e. gives r_bg()
a semi-random initial
seed to work with (by removing .Random.seed
) and then undo
the RNG state at the very end.Now resolved()
supports early signaling.
Now result()
and value()
gives a
slightly more informative error message in case the
callr process failed with a non-zero exit
code.
Add option to configure callr futures to be
“supervised” by the callr package when setting up the
plan, i.e. plan(callr, supervise = TRUE)
.
Now callr-specific orchestration errors are of class
CallrFutureError
, which provides information also on the
future that failed.
await()
, which was used for
internal purposes.nbrOfFreeWorkers()
.await()
, which was used for
internal purposes.resolved()
for CallrFuture
will launch
lazy futures [future (>= 1.15.0)].top
) via a dummy
--future-label="<label>"
argument in the
callr system call.plan(callr, workers)
where workers
being a
function would result in an error when a future was created.plan(list(callr, callr))
the second layer of
futures would use the same number of workers as the first layer.Argument workers
of future strategies may now also
be a function, which is called without argument when the future strategy
is set up and used as is. For instance,
plan(callr, workers = halfCores)
where
halfCores <- function() { max(1, round(availableCores() / 2)) }
will use half of the number of available cores. This is useful when
using nested future strategies with remote machines.
Gathering of results from background processes is made a little bit more robust against slow file systems by retrying a few times before accepting an error as an error.
future.wait.timeout
.FutureError
where
applicable.plan(callr, workers = n)
was not
respected.plan(callr)
or
plan(callr, workers = 4L)
.