我正在尝试编写具有多线程功能的CRAN软件包。我用doSNOW
实现了完美的解决方案,但是CRAN团队将该软件包标记为“已取代”,他们要求我切换到doParallel
解决方案。很好,但是我找不到像使用doParallel
一样的方法来监视使用doSNOW
完成的作业数量。这是我的doSNOW
解决方案:
# Set up parameters
nthreads<-2
nreps<-100
funrep<-function(i){
res<-c(log2(i),log10(i))
Sys.sleep(0.1)
}
# 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
来监视作业状态完成的解决方案?可能带有进度条,也可能具有多操作系统功能。非常感谢!
pbabbly:
# pbapply solution
library(pbapply)
cl<-parallel::makeCluster(nthreads)
invisible(parallel::clusterExport(cl=cl,varlist=c("nreps")))
invisible(parallel::clusterEvalQ(cl= cl,library(dplyr)))
result<-pblapply(cl=cl,
X=1:nreps,
FUN=funrep)
parallel::stopCluster(cl)