Я пытаюсь написать пакет 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)
А вот решение 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
? Возможно, с индикатором выполнения, а также возможно с поддержкой нескольких ОС. Большое спасибо!