2

딜 직렬화/산세에 대한 내 코드의 상당 부분을 구축 했으므로 pathos 다중 처리를 사용하여 계산을 병렬화하려고합니다. Pathos 그것은 딜의 자연스러운 연장입니다. 중첩 된 계층 적 경로 다중 처리 맵을 실행하는 방법은 무엇입니까?

는 내가받을 타 ProcessingPool().map 내부
from pathos.multiprocessing import ProcessingPool 
ProcessingPool().map(fn, args) 

중첩 실행할 때 :

AssertionError: daemonic processes are not allowed to have children 

예컨대 :

from pathos.multiprocessing import ProcessingPool 

def triple(x): 
    return 3*x 

def refork(x): 
    from pathos.multiprocessing import ProcessingPool 
    return ProcessingPool().map(triple, xrange(5)) 

ProcessingPool().map(refork, xrange(3)) 

수익률

AssertionError: daemonic processes are not allowed to have children 

amap(...).get()을 사용해 보았는데 성공하지 못했습니다. 이것은 pathos 0.2.0에 있습니다.

중첩 병렬 처리를 허용하는 가장 좋은 방법은 무엇입니까?

업데이트 나는이 시점에서 솔직히, 나는 비애의 주장 "daemonic processes are not allowed to have children"를 제거했는지 고백해야

. 나는 또한 ... 사람들의 노동자와 노동자 뭔가 폭포 KeyboardInterrupt을 구축 아래 솔루션의 부품 :

def run_parallel(exec_func, exec_args, num_workers_i) 
    pool = ProcessingPool(num_workers_i) 
    pool.restart(force=True) 
    pid_is = pool.map(get_pid_i, xrange(num_workers_i)) 
    try: 
     results = pool.amap(
      exec_func, 
      exec_args, 
     ) 
     counter_i = 0 
     while not results.ready(): 
      sleep(2) 
      if counter_i % 60 == 0: 
       print('Waiting for children running in pool.amap() with PIDs: {}'.format(pid_is)) 
      counter_i += 1 
     results = results.get() 
     pool.close() 
     pool.join() 
    except KeyboardInterrupt: 
     print('Ctrl+C received, attempting to terminate pool...') 
     hard_kill_pool(pid_is, pool) # sending Ctrl+C 
     raise 
    except: 
     print('Attempting to close parallel after exception: {}'.format(sys.exc_info()[0])) 
     cls.hard_kill_pool(pid_is, pool) # sending Ctrl+C 
     raise 


def hard_kill_pool(pid_is, pool): 
    for pid_i in pid_is: 
     os.kill(pid_i, signal.SIGINT) # sending Ctrl+C 
    pool.terminate() 

콘솔과 (정지 버튼) IPython 노트북에서 작동하는 것 같다,하지만 확실하지가 100 % 맞습니다 모든 구석에서.

+0

저는'pathos' 저자입니다. 프로세스가 프로세스를 생성 할 수없는 이유는 프로세스가 제대로 작동하지 않아 결국 멈추는 좀비 프로세스가 있기 때문입니다. @ Yoda의 솔루션을 추천합니다. 전형적인 케이스 ... 하나의 "값 비싼"병렬 블록과 몇 개의 "가벼운"병렬 비트의 작업입니다. 'pathos'는 느린 속도의'ParallelPool'을 가지고 있지만, 쓰레드가 아닌 다른 것이 필요할 때 작동합니다. 블로킹은 속도가 느려지므로 비 블로킹 맵을 사용하여 실험해볼 것을 제안합니다. 또한 참조하십시오 : http://stackoverflow.com/questions/28203774 –

+0

@MikeMcKerns, 나는 (데몬 프로세스가 아닌) 여러 가지 방법으로 코드를 실험하기 시작했고 위의 작업으로 끝났습니다. 'amap'도 포함되었지만 다른 이유로'Ctrl + C '는'map'에서 나를 빠져 나가지 못했습니다. 불행히도 "경량"트릭을 사용할 수 없습니다. 이는 이미 딜레도 (pathillos)를 발견 할 때 더 큰 시스템 이었기 때문입니다. 이제 다음 과제는 일종의 공유 메모리 (모든 프로세스를 쓰는 것으로 읽음)를 갖는 것입니다. 이것은 계단식 솔루션을 사용하여 어려울 것으로 보입니다. 훌륭한 도구 btw, 감사합니다! –

+0

다른 풀 ('ThreadingPool' 또는'ParallelPool') 중 하나를 사용하여 중첩 된 병렬 처리를 제공하지 못하고 'ProcessingPools'의 계층 구조를 필요로하는 워크 플로우의 종류는 상상할 수 없습니다. 어쩌면 당신은 내가 생각하지 못했던 유즈 케이스를 가지고있을 것이고, 그것에 대해 더 많이 알지도 모르겠다. (아마도'pathos' github 페이지의 티켓 일 것이다.) 네, 어설 션을 제거하면 중첩 된 'ProcessingPools'가 작동합니다. 그러나 중첩 된 스폰 된 풀이 있다고 주장하는 이유는 좀비로 생존하는 경향이 있습니다. 작업 ID를 사용하여 좀비 프로세스를 종료하면 해결 방법이 될 수 있습니다. –

답변

3

정확히 동일한 문제가 발생했습니다. 필자의 경우, 내부 연산은 병렬 처리가 필요한 연산이므로 ProcessingPoolThreadingPool을 수행했습니다. 여기에 귀하의 예가 나와 있습니다 :

from pathos.multiprocessing import ProcessingPool, ThreadingPool 

def triple(x): 
    return 3*x 

def refork(x): 
    from pathos.multiprocessing import ProcessingPool 
    return ProcessingPool().map(triple, xrange(5)) 

ThreadingPool().map(refork, xrange(3)) 

다른 외부 스레드 풀과 함께 다른 레이어를 가질 수도 있습니다. 사례에 따라 이러한 풀의 순서를 바꿀 수 있습니다. 그러나 프로세스 프로세스를 가질 수는 없습니다. 실제로 필요한 경우 https://stackoverflow.com/a/8963618/6522112을 참조하십시오. 나는 나 자신을 아직 시도하지 않았으므로 이것에 대해 자세히 설명 할 수는 없다.

+0

불행히도 필자의 경우, 어떤 레벨이 미리 계산 될지 말할 수없고, 2 레벨의 병렬화를 쉽게 제한 할 수도 없다. –

+0

내가 준 해결책은 효과가있는 것처럼 보이지만 때로는 바깥 수영장이 영원히 걸리지 않는 것처럼 보입니다. 나는 운이없는'imap'과'amap'을 시도했다. 어쩌면 @MikeMcKerns가 이것을 깨달을 수 있습니까? 'ParallelPool'이 도움이 될 수 있습니까? – Y0da

+0

기본적으로 파이썬의'multiprocessing.Pool'은 부모가 죽으면 깨끗하게 죽이지 않습니다. 'multiprocess'와'pathos'는 같은 코드를 재사용하기 때문에 같은 문제가 있습니다. 'pathos.pools.ParallelPool'는'multiprocessing'에서 포크하지 않습니다 (대신'pp'에서 나온 것입니다). 따라서 같은 문제가 발생하지 않습니다 ... 그러나 직렬화가 약합니다 ("소스 추출"은 "pickling"이며 공유 객체를 허용하지 않습니다). –