R - 在 运行 并行时获取工作人员姓名
R - get worker name when running in parallel
我是运行一个并行的函数。为了获得有关工作状态的最新进展,我希望只有一名工人定期报告其进展情况。对于如何做到这一点,我的自然想法是让工作人员执行的功能检查工作人员的姓名,并且仅在名称与特定值匹配时才提供状态更新。但是,我找不到一种可靠的方法来提前确定这一点。例如,在 Julia 中,有一个简单的 myid()
函数可以给出工人的 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
包不提供工作人员 ID 功能。也没有提供在工作人员开始执行任务之前对其进行初始化的机制。
我建议您使用 mcmapply
函数将额外的任务 ID 参数传递给辅助函数。如果任务数等于工人数,则任务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.preschedule
是 TRUE
,这是默认值。如果 mc.preschedule
是 FALSE
并且任务数量大于工作人员数量,则情况更加动态,因为每个任务都由不同的工作进程执行,并且工作人员不会同时执行.
我是运行一个并行的函数。为了获得有关工作状态的最新进展,我希望只有一名工人定期报告其进展情况。对于如何做到这一点,我的自然想法是让工作人员执行的功能检查工作人员的姓名,并且仅在名称与特定值匹配时才提供状态更新。但是,我找不到一种可靠的方法来提前确定这一点。例如,在 Julia 中,有一个简单的 myid()
函数可以给出工人的 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
包不提供工作人员 ID 功能。也没有提供在工作人员开始执行任务之前对其进行初始化的机制。
我建议您使用 mcmapply
函数将额外的任务 ID 参数传递给辅助函数。如果任务数等于工人数,则任务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.preschedule
是 TRUE
,这是默认值。如果 mc.preschedule
是 FALSE
并且任务数量大于工作人员数量,则情况更加动态,因为每个任务都由不同的工作进程执行,并且工作人员不会同时执行.