2017-10-13 11 views
0

두 개의 알고리즘 A와 B가 있습니다. 두 알고리즘 모두 입력과 ​​동일한 문자열을 사용하고 문자열을 반환하고 새 문자열을 반환합니다.Python 3 : 2 개의 프로세스를 시작하려면 어떻게 시작합니까? 먼저 끝나면 응답을 반환하고 다른 프로세스는 일찍 종료합니다.

수행되는 변환은 매우 CPU 집약적 일 수 있으며 알고리즘에는 문제에 대한 다른 접근 방식이 있습니다. 알고리즘은 입력 문자열에 따라 크게 다르게 수행하지만, 어떤 알고리즘이 변환을 적용하는지에 대한 대답은 신경 쓰지 않습니다.

def process_alg1(algorithm1, input_string) 

    ans_string = algorithm1(input_string) 

    q.put(ans_string) 

def process_alg2(algorithm2, input_string) 

    ans_string = algorithm2(input_string) 

    q.put(ans_string) 


def apply_transformation(input_string): 

    q = multiprocess.Queue() 

    process_alg1(input_string) 

    process_alg2(input_string) 

    final_answer = q.get() 

    stop(slowest_process) 

내가 데몬 프로세스를 사용해야합니다 같은데요 :

은 좀 더 문제를 설명하기 위해 일부 사이비 코드를 작성했습니다? 나는 어떤 접근을해야할지 모르겠다. 프로세스와 느린 프로세스를 멈추게하는 일종의 핸들러 사이에 파이프 라인을 설정합니까? 데몬과 대기열을 사용하여이 작업을 수행 할 수 있습니까?

동일한 알고리즘에 대해 여러 입력에 대한 예제가 많이 있지만 동일한 입력으로 작동하는 여러 알고리즘에 대한 예제가 없습니다.

감사합니다.

+0

주기적으로 자식 프로세스 ''아직 종료가 있는지 확인하려면 exitcode' 속성을 폴링 주요 과정을해야합니다. 다른 자식 (또는 둘 다)이 주기적으로 검사하여 종료 할 것을 알기 위해 일종의 공유 변수를 수정해야합니다. sigkill을 보내는 것은 좋지 않으며, 동등한 직접 창을 가지지 않습니다. – Aaron

+0

@Aaron, 둘 다 데몬 프로세스를 사용하고 내 프로그램의 다른 부분에서이 apply_transformation 함수를 호출하면 apply_transformation 호출 후 또는 전체 프로그램이 완료된 후 프로세스가 종료됩니까? –

+0

dameon 프로세스와 같은 것은 없습니다 .. 스레드 만 – Aaron

답변

0

희망이 도움이됩니다. 대신 큐의 사용 파이프 :

def process_alg1(algorithm1, input_string) 

    ans_string = algorithm1(input_string) 

    q.put(ans_string) 

def process_alg2(algorithm2, input_string) 

    ans_string = algorithm2(input_string) 

    q.put(ans_string) 


def apply_transformation(input_string): 

    q = multiprocess.Queue() 

    p1 = process_alg1(input_string) 

    p2 = process_alg2(input_string) 

    p1.start() 
    p2.start() 

    while p1.is_alive() and p2.is_alive(): 
     print 'Both are still computing' 


    final_answer = q.get() 

    stop(p1 if p1.is_alive() else p2) 
+0

아, 이건 정말 간단하고 사랑 해요. 큐 대신 파이프를 사용하면 정확히 무엇을 의미합니까? 의사 코드에서는 아직 큐를 사용하고있는 것처럼 보입니다. 나는 그것을 바꿔야 할까? –

+0

이 답변은 불완전하며 설명 된 질문과 같이 하위 프로세스를 중단하지 않습니다. 프로세스를위한'stop()'함수는 없다. 그것에 가장 가까운 것은 pid를 찾아보고 pcall을 사용하여 그것을 sigkill하는 것입니다. 창에 대한 진정한 동등 물은 없습니다. – Aaron

+0

프로세스를 종료 할 수있는 파이썬의 다중 처리 모듈에는 terminate 메소드가 있습니다. 또한 그것은 singal을 반환합니다. –

1

여기에 최소한의 예입니다 :

import multiprocessing as mp 
from time import sleep 
from numpy.random import randint 

def task(n, stopsignal): 
    for x in range(n): #complex computation task steps (iterations, etc.. however you break it up) 
     with stopsignal.getlock(): 
      if stopsignal.value: 
       print(mp.current_process().name + " recieved stop signal. Terminating.") 
     time.sleep(1) #complex computation 
    print(mp.current_process().name + " returned first. attempting to halt others...") 

stopsignal = mp.Value('b', 0, lock=True) #'b' for signed 8 bit int (could use other types) 
processes = [] 
for i in range(5): #start 5 processes 
    p = Process(
      target=task, 
      name="Process_{}".format(i), 
      args=(randint(5,20),stopsignal,), 
     ) 
    p.start() 
    processes.append(p) 

while True: 
    with stopsignal.getlock(): 
     if stopsignal.value: 
      break 
    for p in processes: #check each process 
     if p.exitcode is not None: #will be None until process terminates 
      with stopsignal.getlock(): #aquire rlock 
       stopsignal.value = 1 
      break 
    sleep(1) #only check every second