【问题标题】:Run asynchronous function in R在 R 中运行异步函数
【发布时间】:2016-12-09 10:07:35
【问题描述】:

我有以下代码:

myfun <- function() {
  fun2()

  return(1+1)
}

我希望 fun2() 被调用,然后移动到下一行而不等待结果。函数 fun2 不返回任何内容,我不在乎它何时完成,我只需要启动它。实现它的最佳方法是什么?并行进程,多线程,异步调用?任何代码示例表示赞赏。

【问题讨论】:

  • 您使用的是什么操作系统?窗户?
  • 是的,windows 7。虽然我想让它在其他操作系统上也能工作。

标签: r multithreading asynchronous parallel-processing


【解决方案1】:

future package(我是作者)提供了这个:

library("future")
plan(multiprocess)

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

  return(1+1)
}

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

f <- future(fun2())
y <- fun3()
v <- value(f)
z <- v + y

另一种方法是使用%&lt;-% 运算符,如下所示:

v %<-% fun2()
y <- fun3()
z <- v + y

仅供参考,如果您使用

plan(cluster, workers = c("n1", "n3", "remote.server.org"))

然后在其中一台机器上解析未来表达式。使用

plan(future.BatchJobs::batchjobs_slurm)

将导致它通过 Slurm 作业调度程序队列解决。

【讨论】:

  • 你会推荐使用未来引擎的foreach接口,还是furrr
  • 它们都是 map-reduce 兄弟,在并行处理方面同样高效:foreach w/ doFuture, future.apply, furrr, ... 你可以选择你喜欢的 map-reduce 风格。
  • 谢谢。我看到了您的 rstudio 演示文稿,感谢您帮助我们更快地运行我们的模型!
  • 谢谢,我很高兴你发现它很有用。 {future} 建立在其他人之前和现有的工作之上,所以我站在巨人之上
【解决方案2】:

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

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)

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

【讨论】:

    猜你喜欢
    • 2022-11-16
    • 2020-07-07
    • 1970-01-01
    • 2021-09-23
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    相关资源
    最近更新 更多