嵌套的furrr::future_map?

lrn*_*rnv 6 r furrr

有没有一种配置方法furrr::future_map可以允许嵌套用例?考虑以下代码:

library(furrr)
library(tictoc)

# The problem is easier to reason about if you take N
# smaller than your number of cores, and M big.
N = 2 
M = 100

plan(sequential)
tic()
x = future_map(1:N, function(i){
  furrr::future_map(1:M,function(j){
    Sys.sleep(1/M)
    return(1)
  })
})
toc() # 2sec + overhead

plan(multiprocess)
tic()
x = future_map(1:N, function(i){
  furrr::future_map(1:M,function(j){
    Sys.sleep(1/M)
    return(1)
  })
})
toc() # one sec + overhead !!
Run Code Online (Sandbox Code Playgroud)

第一个应该需要 2 秒多一点的时间。还行吧。但是,即使在千核机器上,有没有办法让第二个运行时间少于 1 秒?

我的用例如下:一些子任务比其他子任务需要更长的时间才能完成,当一些子任务完成时,一些核心可以自由地进一步分派更长的任务。

但furrr默认情况下不会这样做,并且长期运行的任务最终只在一个核心上。该问题与上面代码中显示的问题相同:是否有一种方法可以在某些核心空闲的情况下让furrr重新分派内部任务?

这是不可能做到的,还是我错过了furrr/future 调用的参数?

Dom*_*ngo 2

编辑:感谢henrikb的评论,由于自 2023 年 7 月以来的弃用,将多进程更改为多会话。

Axeman提到的A Future for R: Future Topologies中,您可以使用in . 列表中的元素显示了深度。因此,如果您提供两个计划,并行化也会在您的嵌套中运行,例如:future::tweakfuture::planfurrr::future_map

future::plan(
      list(
        future::tweak(
          future::multisession, 
          workers = 2), 
        future::tweak(
          future::multisession,
          workers = 4)
        )
      )
Run Code Online (Sandbox Code Playgroud)

该示例适用于 8 个核心,因为前两个工作线程中的每一个都会获得 4 个额外的工作线程。