过早停止正在运行的mcparallel作业

过早停止正在运行的mcparallel作业,r,parallel-processing,R,Parallel Processing,我有三项任务: 磁盘I/O绑定了吗 网络I/O是否绑定 CPU是否绑定在远程计算机上 3的结果将告诉我我想要的答案是来自任务1还是任务2。由于每个任务都需要单独的资源,因此我希望使用mcparallel启动所有三个任务,然后等待第三个任务的结果,并确定是否终止任务1或任务2。但是,我无法确定如何过早地从R中取消mcparallel任务。通过调用system()终止分叉进程的PID是否安全?如果没有,是否有更好的方法来取消不必要的计算?我认为并行包不支持通过mcparallel启动的进程的正式终止

我有三项任务:

  • 磁盘I/O绑定了吗
  • 网络I/O是否绑定
  • CPU是否绑定在远程计算机上

  • 3的结果将告诉我我想要的答案是来自任务1还是任务2。由于每个任务都需要单独的资源,因此我希望使用mcparallel启动所有三个任务,然后等待第三个任务的结果,并确定是否终止任务1或任务2。但是,我无法确定如何过早地从R中取消mcparallel任务。通过调用system()终止分叉进程的PID是否安全?如果没有,是否有更好的方法来取消不必要的计算?

    我认为
    并行
    包不支持通过
    mcparallel
    启动的进程的正式终止方法,但我猜这样做是安全的,您可以使用
    工具
    包中的
    pskill
    函数来完成。下面是一个例子:

    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)
    
    库(并行)
    图书馆(工具)
    
    fun1看起来很简单,我已经试过几次了,杀死并行pid似乎没有副作用+1用于工具中的pskill。