在R中运行异步功能

Ser*_*nov 5 parallel-processing multithreading asynchronous r

我有以下代码:

myfun <- function() {
  fun2()

  return(1+1)
}
Run Code Online (Sandbox Code Playgroud)

我希望fun2()被调用,然后移到下一行而不等待结果。fun2函数不返回任何内容,我也不关心它何时完成,我只需要启动它即可。最好的方法是什么?并行进程,多线程,异步调用?任何代码示例,不胜感激。

Hen*_*ikB 9

未来的包(我是作者)提供了这一点:

library("future")
plan(multiprocess)

myfun <- function() {
  future(fun2())

  return(1+1)
}
Run Code Online (Sandbox Code Playgroud)

除非fun2()将函数纯粹用于其副作用,否则通常需要检索该将来表达式的值,您可以这样做:

f <- future(fun2())
y <- fun3()
v <- value(f)
z <- v + y
Run Code Online (Sandbox Code Playgroud)

一种替代方法是使用%<-%运算符,如下所示:

v %<-% fun2()
y <- fun3()
z <- v + y
Run Code Online (Sandbox Code Playgroud)

仅供参考,如果您使用

plan(cluster, workers = c("n1", "n3", "remote.server.org"))
Run Code Online (Sandbox Code Playgroud)

然后在其中一台计算机上解析将来的表达式。使用

plan(future.BatchJobs::batchjobs_slurm)
Run Code Online (Sandbox Code Playgroud)

将导致它通过Slurm作业计划程序队列来解决。


Ser*_*nov 5

最终我停止了以下解决方案:

Rpath <- Find(file.exists, c(commandArgs()[[1]], file.path(R.home("bin"), commandArgs()[[1]]),
                             file.path(R.home("bin"), "R"), file.path(R.home("bin"), "Rscript.exe")))
out <- system('%s --no-save --slave -e \"Your R code here\" ', wait=FALSE)
Run Code Online (Sandbox Code Playgroud)

第一行搜索 R 可执行文件的路径,第二行从命令行环境执行 R 代码,不等待结果。