R语言foreach并行循环排序疑问:设置inorder=FALSE仍得有序结果
关于foreach并行计算结果顺序的问题
第一个问题:foreach默认是否保证结果顺序与常规for循环一致?
是的,foreach默认参数.inorder=TRUE,这意味着它会按任务提交的原始顺序来组合最终结果。即使并行任务的实际执行顺序是混乱的,foreach会等待每个任务按提交顺序返回后再拼接结果,最终输出和常规for循环遍历4000:1得到的结果完全一致。
第二个问题:设置.inorder=FALSE为何仍得到有序结果?
你的示例里任务逻辑过于简单——每个任务只是直接返回i,执行耗时几乎可以忽略不计。集群的3个进程会近乎同步地按任务提交顺序完成计算,所以结果刚好呈现有序状态,这只是巧合,并非.inorder=FALSE失效。
如果要验证.inorder=FALSE的无序效果,可以给每个任务添加随机延迟,让任务完成时间变得不确定:
library(foreach) library(doParallel) cl <- makeCluster(3) registerDoParallel(cl) temp = foreach(i=4000:1, .combine='c', .inorder=FALSE) %dopar% { Sys.sleep(runif(1)) # 添加随机延迟,模拟耗时任务 i } temp stopCluster(cl)
此时运行结果就会是无序的,符合.inorder=FALSE的预期:它会按任务实际完成的顺序来组合结果,不再等待任务按提交顺序返回。
内容的提问来源于stack exchange,提问作者lemmingxuan
相关产品推荐
相关产品推荐

