-
Notifications
You must be signed in to change notification settings - Fork 92
Open
Description
Let define a simplified function in a package that looks like that:
pkg_fun <- function(fun, x) {
f <- vector("list", length(x))
for (i in seq_along(x)) {
f[[i]] <- future::future({ fun(x) })
}
# some code to handle resolution and get values of futures...
}Users can use it like that
library(pkg)
library(future)
plan(multisession)
pkg_fun(myfunction, mydata)There is no way for the developer to know what is the plan used by the user. It is sequential? multicore on a single machine? multiple remote machine? I do agree that most of the time the developer do no need to know. But I'm personally facing multiple cases were I need to know to handle stuff internally or to throw informative warning or error. For examples:
myfunctionmay already be parallelized in C++ with OpenMP. Testing the strategy allows to enable or disable OpenMP and avoid nested parallelismmydatacan contain non serializable objects and the code subsequently fails with no informative error for parallel strategies (but works withplan(sequential)). Being able to catch those cases early would allow to handle them nicely.myfunctioncan return non serializable objects. Same issue than 2.
So far I'm using a custom parser than analyses the ouptut of future::plan() but I think it would be a useful addition to add easy to parse functions for developpers in future. Something like that maybe
future::is_parallel_strategy()
future::get_strategy_workers()
future::is_remote_stragety()
future::is_nested_strategy()
# ...Thanks