过早地停止正在运行的mcparallel工作

时间:2015-02-06 18:17:52

标签: r parallel-processing

我有三个任务:

  1. 是磁盘I / O绑定
  2. 是网络I / O绑定
  3. 是远程计算机上的CPU绑定
  4. 3的结果将告诉我我想要的答案是来自任务1还是任务2.由于每个任务需要单独的资源,我想用mcparallel启动所有三个任务,然后等待来自第三个任务,并确定是否终止任务1或任务2.但是,我无法确定如何从R内提前取消mcparallel任务。从调用system()来杀死分叉进程的PID是否安全?如果没有,是否有更好的方法来取消不需要的计算?

1 个答案:

答案 0 :(得分:6)

我认为parallel软件包不支持以mcparallel方式杀死进程的官方方式,但我的猜测是可以安全地使用pskill来自tools包的函数来完成它。这是一个例子:

library(parallel)
library(tools)

fun1 <- function() {Sys.sleep(20); 1}
fun2 <- function() {Sys.sleep(20); 2}
fun3 <- function() {Sys.sleep(5); sample(2, 1)}
f1 <- mcparallel(fun1())
f2 <- mcparallel(fun2())
f3 <- mcparallel(fun3())
r <- mccollect(f3)
if (r[[1]] == 1) {
  cat('killing fun1...\n')
  pskill(f1$pid)
  print(mccollect(f1))
  r <- mccollect(f2)
} else {
  cat('killing fun2...\n')
  pskill(f2$pid)
  print(mccollect(f2))
  r <- mccollect(f1)
}
print(r)

在多线程应用程序中随机杀死线程通常很危险,因为它们可能持有某种类型的共享锁,但这些当然是进程,并且主进程似乎正好处理这种情况。