조기

2015-02-06 2 views
1

나는 세 가지 작업이 실행중인 mcparallel 작업을 중지 :조기

  1. I/O 바운드 디스크입니다 네트워크 I/
  2. 는 CPU 원격 시스템에 바인딩 O 바운드

3의 결과는 내가 원하는 대답이 작업 1 또는 작업 2에서 올지 여부를 알려줍니다. 각 작업마다 별도의 자원이 필요하기 때문에 mcparallel을 사용하여 세 가지 작업을 모두 시작한 다음 세 번째 작업의 결과를 기다리고 싶습니다. termi의 여부를 결정하십시오. nate task 1 or task 2. 그러나 R에서 mcparallel task를 조기에 취소하는 방법을 결정할 수 없다. system()을 호출 할 때 fork 된 프로세스의 PID를 죽이는 것이 안전 할까? 그렇지 않은 경우 불필요한 계산을 취소하는 더 좋은 방법이 있습니까?

답변

3

은 내가 parallel 패키지 mcparallel를 통해 시작 프로세스를 죽일 수있는 공식적인 방법을 지원하지만, 내 생각이 그렇게하는 것이 안전하다고 생각하지 않습니다, 당신은 그것을 수행 할 tools 패키지에서 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) 

그것은 그들이 어떤 종류의 공유 ​​잠금을 보유 할 수 있기 때문에 무작위로 다중 스레드 응용 프로그램 내에서 스레드를 죽일 일반적으로 위험하지만, 물론 이러한 프로세스, 그리고 마스터 프로세스가 처리 할 것 상황은 괜찮아.

+0

나는 이제 몇 번 시도해 보았고 평행 PID를 죽이는 것은 부작용이없는 것처럼 보였다. +1 도구에 pskill. – russellpierce