我正在尝试编写具有多线程功能的CRAN程序包。我使用doSNOW实现了完美的解决方案,但该软件包已被CRAN团队标记为“已取代”,他们要求我切换到doParallel解决方案。很好,但是我找不到与doParallel一样的方法来监视使用doSNOW完成的作业数量。这是我的doSNOW解决方案:

# Set up parameters
nthreads<-2
nreps<-100
funrep<-function(i){
    Sys.sleep(0.1)
    res<-c(log2(i),log10(i))
    return(res)
}
# doSNOW solution
library(doSNOW)
cl<-makeCluster(nthreads)
registerDoSNOW(cl)
pb<-txtProgressBar(0,nreps,style=3)
progress<-function(n){
    setTxtProgressBar(pb,n)
}
opts<-list(progress=progress)
i<-0
output<-foreach(i=icount(nreps),.combine=c,.options.snow=opts) %dopar% {
    s<-funrep(i)
    return(s)
}
close(pb)
stopCluster(cl)

这是建议的in a previous Stack Overflow post的doParallel解决方案。但是,正如您所看到的,它不会在完成工作时打印进度,而只是在结果合并后才打印进度。
# doParallel solution
library(doParallel)
progcombine<-function(){
  count<-0
  function(...) {
    count<<-count+length(list(...))
    setTxtProgressBar(pb,count)
    utils::flush.console()
    c(...)
  }
}
cl <- makeCluster(nthreads)
registerDoParallel(cl)
output<-foreach(i = icount(nreps),.combine=progcombine()) %dopar% {
    funrep(i)
}
stopCluster(cl)

您能否建议我一个使用doParallel或至少不使用被取代的doSNOW监视作业状态完成的解决方案?可能带有进度条,也可能具有多操作系统功能。非常感谢!

最佳答案

我找不到使用doParallel的解决方案(我不认为它支持完成工作的进度条),但是也许您可以尝试使用新的 pbabbly :

# pbapply solution
library(pbapply)
cl<-parallel::makeCluster(nthreads)
invisible(parallel::clusterExport(cl=cl,varlist=c("nreps")))
invisible(parallel::clusterEvalQ(cl=cl,library(utils)))
result<-pblapply(cl=cl,
                 X=1:nreps,
                 FUN=funrep)
parallel::stopCluster(cl)

关于R doParallel进度栏可监视已完成的作业,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58473626/

10-12 05:07