在线程之间传递信息(foreach with %dopar%)



我使用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 是负载均衡的。这不是情况,并使我的问题是绝对的,因为在并行处理时,在主机端不能执行任何操作。这就解释了为什么全局变量只在客户端操作,而不会到达主机。

相关内容

  • 没有找到相关文章

最新更新