2015-02-06 24 views
1

我有三个任务:停止正在运行的mcparallel工作过早

  1. 是磁​​盘I /绑定
  2. O的网络I/O密集型
  3. 是CPU绑定在远程机器上

3的结果会告诉我我想要的答案是来自任务1还是任务2.因为每个任务都需要单独的资源,所以我想用mcparallel开始所有三个任务,然后等待第三个任务的结果并确定是否要终止nate任务1或任务2.但是,我无法确定如何提前从R中取消mcparallel任务。是否可以安全地从调用system()中终止分叉进程的PID?如果没有,是否有更好的方法来取消不需要的计算?

回答

3

我不认为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) 

它通常是危险的多线程应用程序中随意杀死线程,因为它们可能会持有某种类型的共享锁,但这些当然是过程,而主进程似乎处理情况就好了。

+0

似乎很简单,我现在试了几次,并杀死平行pid似乎没有不良副作用。工具中的pskill +1。 – russellpierce 2015-02-08 17:26:28