首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在线程之间传递信息(使用%dopar%的foreach)

在线程之间传递信息(使用%dopar%的foreach)
EN

Stack Overflow用户
提问于 2014-05-18 16:29:28
回答 1查看 490关注 0票数 0

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

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

它适用于单线程(参见makeClust(spec = 1 ))

代码语言:javascript
复制
#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。

代码语言:javascript
复制
[..]
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 

在6: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)。

是否有更好的方法将“已处理”的东西传递给下一代线程?

Bonuspoint:是否有一种方法可以在并行处理中“打印”到主节点,而不需要这些"Type: EXEC“等来自积雪包的消息?)

谢谢!Marc

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-18 20:07:17

是我的错。见鬼。

我想,使用%dopar% 负载平衡的。--这不是的情况,这使我的问题变得越来越多,因为在并行处理时,主机端没有什么可以执行的。这就解释了为什么全局变量只在客户端被操纵,永远不会到达主机。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23724240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档