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

时间:2014-05-18 16:29:29

标签: r foreach cluster-computing snow

我使用doSNOW-包来并行化长度不同的任务。当一个线程完成时,我想要

  • 传递给下一个线程的旧线程生成的一些信息
  • 立即启动下一个线程(像clusterApplyLB中的loadbalancing)

它在单线程中工作(请参阅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)

现在更改&#34; makeCluster&#34;中的规格到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)。

是否有更好的方式来通过&#34;处理&#34;更进一步的线程?

奖励点:有没有办法打印&#34;并行处理中的主节点,没有这些&#34;类型:EXEC&#34;来自雪包的消息等? :)

谢谢! 马克

1 个答案:

答案 0 :(得分:1)

我的坏。该死的。

我认为,%dopar%的foreach 负载均衡。 这不是,并且使我的问题过时,因为在并行处理时主机端无法执行任何操作。这就解释了为什么全局变量只在客户端进行操作而从未到达主机。