首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mclapply保证按顺序返回结果吗?

mclapply保证按顺序返回结果吗?
EN

Stack Overflow用户
提问于 2013-02-05 07:53:28
回答 1查看 3K关注 0票数 15

我正在使用multicore包中的mclapply (在Ubuntu上),并且我正在编写一个函数,该函数要求按顺序返回mclapply(x, f)的结果(即f(x[1]), f(x[2]), ...., f(x[n]))。

代码语言:javascript
复制
# multicore doesn't work on Windows

require(multicore)
unlist(mclapply(
    1:10,
    function(x){
        Sys.sleep(sample(1:5, size = 1))
        identity(x)}, mc.cores = 2))

[1] 1 2 3 4 5 6 7 8 9 10

上面的代码似乎暗示了mclapply返回结果的顺序与lapply相同。

然而,如果这个假设是错误的,我将不得不花很长时间重构我的代码,所以我希望从更熟悉这个包/并行计算的人那里得到保证,这个假设是正确的。

假设mclapply总是按顺序返回结果,而不管给它提供了什么可选参数,这样做安全吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-07 06:59:40

简而言之:它确实以正确的顺序返回结果。

当然,您应该自己阅读代码(mclapply是一个R函数...)

collect的手册页提供了更多提示:

注意:如果expr使用诸如sendMaster之类的低级多核函数,则单个作业可以多次交付结果,用户有责任正确解释这些结果。

然而,如果你不去打乱低级,

collect返回列表中所有可用的结果。结果将与指定的作业具有相同的顺序。如果有多个作业并且作业具有名称,则将使用结果命名,否则将使用其进程ID。

(我的重点)

现在到mclapply了。快速浏览一下源代码会产生以下结果:

  • 如果使用!mc.preschedule且作业数不超过核心(length (X) <= cores) parallelcollect,请参见上文。
  • 如果mc.preschedule或比核心更多的作业,则mclapply自己负责订单-请参阅代码。

然而,这里是你的实验的一个稍微修改过的版本:

代码语言:javascript
复制
> unlist (mclapply(1:10, function(x){
    Sys.sleep(sample(1:5, size = 1)); 
    cat (x, " ");    
    identity(x)}, 
  mc.cores = 2, mc.preschedule = FALSE))
1  2  4  3  6  5  7  8  9  10   [1]  1  2  3  4  5  6  7  8  9 10
> unlist (mclapply(1:10, function(x){
    Sys.sleep(sample(1:5, size = 1)); 
    cat (x, " ");    
    identity(x)}, 
  mc.cores = 2, mc.preschedule = TRUE))
1  3  2  5  4  6  7  8  10  9   [1]  1  2  3  4  5  6  7  8  9 10

这表明子作业以不同的顺序返回结果(更准确地说:子作业将以不同的顺序完成),但结果是按原始顺序组合的。

(可以在控制台上运行,但不能在RStudio中运行-cat不会显示在控制台上)

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

https://stackoverflow.com/questions/14697901

复制
相关文章

相似问题

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