gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:04:14 24 4
gpt4 key购买 nike

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

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 3.3.2 开始,parallel 包不提供 worker ID 函数。也没有提供在工作人员开始执行任务之前对其进行初始化的机制。

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

关于R - 并行运行时获取工作人员名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42053763/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com