【问题标题】:Passing information between threads (foreach with %dopar%)在线程之间传递信息(foreach 使用 %dopar%)
【发布时间】:2023-03-09 02:50:01
【问题描述】:

我正在使用 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)。

有没有更好的方法将“已处理”的内容传递给后代线程?

奖励点:有没有办法在并行处理中“打印”到主节点,而无需从雪包中获得这些“类型:执行”等消息? :)

谢谢! 马克

【问题讨论】:

  • 您还没有理解foreach 循环的工作原理。这不是for 循环。阅读 foreach 包小插图,了解如何将结果组合到一个对象中(顺便说一句。增长一个对象,例如,在循环中使用 append 是 R 中的主要性能问题之一)。 AFAIK,您只能与foreach 并行执行完全独立(令人尴尬的并行)任务。
  • @Roland 我想过这样的事情:“主”程序产生 n 个工作线程。当其中 1 个完成时,主程序获取结果,可能会进行一些后处理(将进度打印到控制台,操作全局变量等)并生成一个新的。我不认为这是一个非常罕见的用例。我已经知道,前 n 个线程不会有其他线程的信息(因为它们在新线程生成时正在运行)。在我的情况下,在新进程产生时拥有所有数据就足够了。

标签: r foreach cluster-computing snow


【解决方案1】:

我的错。该死。

我认为,带有 %dopar% 的 foreach 是负载平衡的。 情况并非如此,这让我的问题变得过时了,因为在并行处理时主机端无法执行任何操作。这就解释了为什么全局变量只在客户端进行操作而永远不会到达主机。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    相关资源
    最近更新 更多