R - 并行运行时获取工作者名称

时间:2017-02-05 15:28:04

标签: r parallel-processing mclapply

我正在并行运行一个函数。为了获得有关工作状态的最新进展,我希望只有一名工作人员定期报告其进展情况。我对如何执行此操作的自然想法是让worker执行的函数检查worker的名称,并且只有在名称与特定值匹配时才提供状态更新。但是,我找不到一个可靠的方法来提前确定。例如,在Julia中,有一个简单的myid()函数可以给出一个工人的ID(即1,2等)。我正在寻找R中的等价物。到目前为止,我发现的最好的是让每个工人打电话Sys.getpid()。但是,我不知道编写脚本的可靠方法,以便我事先知道分配给工作人员的一个pid是什么。我正在寻找的基本功能脚本如下所示,除了我正在寻找R等效于myid()函数:

library(parallel)

Test_Fun = function(a){
    for (idx in 1:10){
        Sys.sleep(1)
        if (myid() == 1){
            print(idx)
        }
    }
}

mclapply(1:4, Test_Fun, mc.cores = 4)

1 个答案:

答案 0 :(得分:1)

从{3.3}开始,parallel包不提供工作者ID功能。在开始执行任务之前,还没有提供初始化工作程序的机制。

我建议您使用mcmapply函数将其他任务ID参数传递给worker函数。如果任务数等于工作者数,则任务ID可用作工作者ID。例如:

library(parallel)
Test_Fun = function(a, taskid){
    for (idx in 1:10){
        Sys.sleep(1)
        if (taskid == 1){
            print(idx)
        }
    }
}
mcmapply(Test_Fun, 1:4, 1:4, mc.cores = 4)

但是如果任务多于工作人员,则只能看到第一个任务的进度消息。您可以通过在执行第一个任务时初始化每个工作人员来解决这个问题:

WORKERID <- NA  # indicates worker is uninitialized
Test_Fun = function(a, taskid){
    if (is.na(WORKERID)) WORKERID <<- taskid
    for (idx in 1:10){
        Sys.sleep(1)
        if (WORKERID == 1){
            print(idx)
        }
    }
}
cores <- 4
mcmapply(Test_Fun, 1:8, 1:cores, mc.cores = cores)

请注意,这假定mc.prescheduleTRUE,这是默认值。如果mc.prescheduleFALSE并且任务数量大于工作者数量,则情况更加动态,因为每个任务都由不同的工作进程执行,并且工作程序并非全部并发执行