2014-09-26 3 views
2

복잡한 시뮬레이션의 매개 변수 최적화를 수행 중입니다. 최적 알고리즘의 성능을 높이기 위해 다중 처리 모듈을 사용하고 있습니다. 내가 배운 멀티 프로세싱의 기초는 http://pymotw.com/2/multiprocessing/basics.html입니다. 복잡한 시뮬레이션은 최적화 알고리즘의 주어진 매개 변수에 따라 약 1 ~ 5 분 정도 소요됩니다. 매개 변수가 매우 잘못 선택된 경우 시뮬레이션은 30 분 이상 지속될 수 있으며 결과는 유용하지 않습니다. 그래서 멀티 프로세싱에 대한 타임 아웃을 빌드 할 생각이었습니다. 정의 된 시간 이상 지속되는 모든 시뮬레이션을 종료합니다. 문제의 Heres는 추상화 된 버전 :파이썬 다중 처리 모듈 : 시간 초과가있는 프로세스에 참여

import numpy as np 
import time 
import multiprocessing 

def worker(num): 

    time.sleep(np.random.random()*20) 

def main(): 

    pnum = 10  

    procs = [] 
    for i in range(pnum): 
     p = multiprocessing.Process(target=worker, args=(i,), name = ('process_' + str(i+1))) 
     procs.append(p) 
     p.start() 
     print 'starting', p.name 

    for p in procs: 
     p.join(5) 
     print 'stopping', p.name 

if __name__ == "__main__": 
    main() 

라인 p.join(5) 5 초 시간 제한을 정의합니다. for-loop for p in procs: 때문에 프로그램은 첫 번째 프로세스가 끝날 때까지 5 초를 기다린 다음 두 번째 프로세스가 끝날 때까지 5 초를 기다리는 등의 작업을하지만 5 초 이상 지속되는 모든 프로세스가 종료되도록합니다. 또한 프로세스가 5 초 이상 지속되지 않으면 프로그램은이 5 초를 기다리지 않아야합니다.

+0

http://stackoverflow.com/q/1191374/2615940 그것은 중복일지도 모르지만 나는 당신을 위해 그것을 깃발을 긋기에 충분하지 않습니다. 그 답변에 대한 제안 된 해결책이 효과가 없을 경우 그 이유를 알려주십시오. – skrrgwasme

+0

이것은 흥미로운 기사이지만, 내가 본 바로는 연속적으로 그리고 동시에 시작되지 않은 프로세스에 대한 솔루션입니다. 내 프로그램은 동시에 프로세스를 시작하고 '전역'시간 초과를 초과하는 프로세스를 종료해야합니다. – brp

답변

3

시간 제한을 초 단위로 기다리고 모든 프로세스가 완료되었는지를 자주 확인하는 루프를 작성하여이 작업을 수행 할 수 있습니다. 내가 찾은 솔루션 단오의 도움을

TIMEOUT = 5 
start = time.time() 
while time.time() - start <= TIMEOUT: 
    if any(p.is_alive() for p in procs): 
     time.sleep(.1) # Just to avoid hogging the CPU 
    else: 
     # All the processes are done, break now. 
     break 
else: 
    # We only enter this if we didn't 'break' above. 
    print("timed out, killing all processes") 
    for p in procs: 
     p.terminate() 
     p.join() 
+0

감사합니다. 적절한 해결책 인 것 같습니다. 시간 제한에 도달하기 전에 프로세스가 완료되면 불행히도이 코드는 중단되지 않습니다. 나는 worker 함수를'time.sleep (1)'로 설정하고, 1 초 후에 모든'p.is_alive()'는'False'를 리턴했다. 그래서 코드는 이제'break' 문으로 가야하지만 여전히 제한 시간을 기다리고 있습니다 ... – brp

+0

문제가 발견되었습니다 :'print (p의 procs에 대한 p.is_alive())'는'<생성자 객체 at 0x05712B20>''그러나'any() '에 대해 이해할 수있는'True' 또는'False' 요소가있는 목록이어야합니다. – brp

+0

@brp'any ([p in procs]에 대한 p.is_alive()')를 사용하십시오. 그렇게하면 생성자 표현 대신 목록 이해가됩니다. – dano

1

감사 :

import numpy as np 
import time 
import multiprocessing 

def worker(num): 

    time.sleep(np.random.random()*20) 

def main(): 

    pnum = 10  
    TIMEOUT = 5 
    procs = [] 
    bool_list = [True]*pnum 

    for i in range(pnum): 
     p = multiprocessing.Process(target=worker, args=(i,), name = ('process_' + str(i+1))) 
     procs.append(p) 
     p.start() 
     print 'starting', p.name 

    start = time.time() 
    while time.time() - start <= TIMEOUT: 
     for i in range(pnum): 
      bool_list[i] = procs[i].is_alive() 

     print bool_list 

     if np.any(bool_list): 
      time.sleep(.1) 
     else: 
      break 
    else: 
     print("timed out, killing all processes") 
     for p in procs: 
      p.terminate() 

    for p in procs: 
     print 'stopping', p.name,'=', p.is_alive() 
     p.join() 

if __name__ == "__main__": 
    main() 

그것을하지 않는 대부분의 사람들은 시간이 할당 된 양 모든 마무리를 할 경우, 모든 프로세스를 종료 우아한 방법, 확실한 방법은 bool_list을 사용하는 것보다 낫습니다. 5 초의 시간 초과 후 아직 살아있는 프로세스는 종료됩니다. 작업자 기능에서 제한 시간보다 짧은 시간을 설정하면 5 초의 시간 초과에 도달하기 전에 프로그램이 중지된다는 것을 알 수 있습니다. 여전히 우아한 솔루션을 원할 경우 열어 둡니다.

6

멀티 프로세싱에서 풀을 사용할 수있는 모든 프로세스를 종료하려면 개별 시간 초과와 관련하여 모든 실행에 일반 시간 초과를 정의해야합니다 .

import numpy as np 
import time 
from multiprocessing import Pool 

def worker(num): 
    xtime = np.random.random()*20 
    time.sleep(xtime) 
    return xtime 

def main(): 

    pnum = 10 
    pool = Pool() 
    args = range(pnum) 
    pool_result = pool.map_async(worker, args) 

    # wait 5 minutes for every worker to finish 
    pool_result.wait(timeout=300) 

    # once the timeout has finished we can try to get the results 
    if pool_result.ready(): 
     print pool_result.get(timeout=1) 

if __name__ == "__main__": 
    main() 

이렇게하면 모든 작업자의 반환 값 목록이 순서대로 표시됩니다.
자세한 내용은 여기를 참조하십시오. https://docs.python.org/2/library/multiprocessing.html#module-multiprocessing.pool

관련 문제