我使用doSNOW- package来并行化不同长度的任务。当一个线程完成时,我想要
- 旧线程生成的一些信息传递给下一个线程
- 立即启动下一个线程(像在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)。
是否有更好的方法将"已处理"的东西传递给后代的线程?
是否有一种方法可以在并行处理中"打印"到主节点,而不需要从snow包中获得这些"Type: EXEC"等消息?:)谢谢!Marc
我的错。该死的。
我想,使用%dopar% 的foreach 是负载均衡的。这不是情况,并使我的问题是绝对的,因为在并行处理时,在主机端不能执行任何操作。这就解释了为什么全局变量只在客户端操作,而不会到达主机。