【问题标题】:R - get worker name when running in parallelR - 并行运行时获取工作人员名称
【发布时间】:2017-02-05 15:28:04
【问题描述】:

我正在并行运行一个函数。为了获得有关工作状态的进度更新,我希望一名但只有一名工作人员定期报告其进度。我对如何做到这一点的自然想法是让工作人员执行的功能检查工作人员的名称,并且仅在名称与特定值匹配时才提供状态更新。但是,我找不到可靠的方法来提前确定这一点。例如,在 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)

【问题讨论】:

    标签: r parallel-processing mclapply


    【解决方案1】:

    从 R 3.3.2 开始,parallel 包不提供工作人员 ID 功能。也没有提供一种机制来在工作人员开始执行任务之前对其进行初始化。

    我建议您使用mcmapply 函数将一个额外的任务ID 参数传递给worker 函数。如果任务数与worker数相等,则task ID可以作为worker 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 并且任务的数量大于工作人员的数量,则情况会更加动态,因为每个任务都由不同的工作进程执行,并且工作人员不会同时执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-15
      • 1970-01-01
      • 2019-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多