我正在使用 doSNOW- 包来并行化长度不同的任务。当一个线程完成时,我想要
- 旧线程产生的一些信息传递给下一个线程
- 立即启动下一个线程(如 clusterApplyLB 中的负载平衡)
它在单线程中工作(参见 makeClust( spec = 1 ))
#Register Snow and doSNOW
require(doSNOW)
#CHANGE spec to 4 or more, to see what my problem is
registerDoSNOW(cl <- makeCluster(spec=1,type="SOCK",outfile=""))
numbersProcessed <- c() # init processed vector
x <- foreach(i = 1:10,.export=numbersProcessed) %dopar% {
#Do working stuff
cat(format(Sys.time(), "%X"),": ","Starting",i,"(Numbers processed so far:",numbersProcessed, ")\n")
Sys.sleep(time=i)
#Appends this number to general vector
numbersProcessed <- append(numbersProcessed,i)
cat(format(Sys.time(), "%X"),": ","Ending",i,"\n")
cat("--------------------\n")
}
#End it all
stopCluster(cl)
现在将“makeCluster”中的规范更改为 4。输出是这样的:
[..]
Type: EXEC
18:12:21 : Starting 9 (Numbers processed so far: 1 5 )
18:12:23 : Ending 6
--------------------
Type: EXEC
18:12:23 : Starting 10 (Numbers processed so far: 2 6 )
18:12:25 : Ending 7
在 18:12:21 线程 9 知道,线程 1 和 5 已被处理。2 秒后线程 6 结束。下一个线程必须至少知道 1、5 和 6,对吧?但是线程 10 只知道 6 和 2。
我意识到,这与 makeCluster 中指定的内核有关。9 知道 1、5 和 9 (1 + 4 + 4),10 知道 2,6 和 10 (2 + 4 + 4)。
有没有更好的方法将“已处理”的东西传递给更几代的线程?
奖励点:有没有办法在并行处理中“打印”到主节点,而无需从雪包中获得这些“类型:执行”等消息?:)
谢谢!马克