我正在尝试编写具有多线程功能的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/