2014-06-24 8 views
2

멀티 프로세싱을 사용하는 방법을 배우기 시작했습니다. 배우기에 가장 좋은 방법은 몇 가지 시도를하고 어떻게되는지 확인하는 것입니다. 그렇게 했었지 만 첫 번째 시도에서 이해할 수없는 것을 얻었 기 때문에 귀하의 의견이나 귀하의 수정에 감사드립니다.멀티 프로세싱을 이해하려고 시도합니다.

그래서 저는 아주 쉬운 프로그램을 만들었습니다.

from tables import * 
import scipy as sc 

def getP(pathToTable, p): 

    with openFile(pathToTable,'r') as f: 

     tab = f.getNode("/mainTab") 
     a = [row['value'] for row in tab.where("(page == p) & (ok == 1)")] 

     print (p, sc.mean(a), sc.std(a)) 

을 그리고, 그것을 테스트하기 위해,이 같은 일을 오전 : 단일 주어진 매개 변수에 따라 결과를 인쇄

>>> import multiprocessing 
>>>pags = [1,2,3,4,5,6,7,8] 
>>> te = 'C:\Desktop\testMultiProc.h5' 
>>>import testMp as m 
>>> for i in pags: 
...  p = multiprocessing.Process(target=m.getP, args=(te,i)) 
...  p.start() 
...  p.join() 
... 

이 작동하고, 나는이 같은 결과를 얻고있다 :

이 왜 순서대로 출력을 얻고, 다음, 동시에 일어나고,

내가 잘못 아니에요 경우 ?? :3210

(1, 9.0953793794588282, 0.33533126564851207) 
(2, 9.0871612678994946, 0.33453983570210977) 
(3, 9.0466206717415556, 0.32227094723414906) 
(4, 9.1115445293825204, 0.32247317223440275) 
(5, 9.1731876730458826, 0.33230456228097616) 
(6, 8.9801903625732713, 0.32238759095899067) 
(7, 9.0102797573336719, 0.34441213144617178) 
(8, 8.8340961470191885, 0.32342748738790894) 

그래서 여기 내 질문을 올 제 말은, p = 3 일 때, p = 3 인 테이블에 값이 거의 없기 때문에 프로세스가 첫 번째로 종료한다고 가정 해 봅시다. 그래서 예를 들어 (3, 9.0466206717415556, 0.32227094723414906)을 첫 번째 출력으로 얻지 못합니까?

그게 내가 잘못하고 있다고 생각하거나 내가 무슨 일이 일어나고 있는지 아직 이해할 수 없다.

>>> multiprocessing.cpu_count() 
8 

그래서 내 생각은 8 개 코어의 이익을했다 :

내가 마음에 아이디어 pags = [1,2,3,4,5,6,7,8]을 선택 .... 내가 먼저 내가했던, 그 때문에했다.

답변

2

아니오, join을 호출하기 때문에 동시에 발생하지 않습니다.

join은 프로세스가 완료 될 때까지 차단됩니다. 효과적으로

:

  1. 당신은 당신이 그 프로세스를 기다리
  2. 당신은 두 번째 항목을 처리하기 위해 별도의 프로세스를 시작 완료하는 첫 번째 항목을 처리하기 위해 별도의 프로세스를 시작
  3. 해당 프로세스가 완료 될 때까지 기다리는 중입니다
  4. ... 등등

join 호출을 해당 루프 내에 놓아야합니다.

processes = [] 
for i in pags: 
    p = multiprocessing.Process(target=m.getP, args=(te,i)) 
    p.start() 
    processes += [p] 

for p in processes: 
    p.join() 
+0

감사 라세는, 그래 그것은 내가 원하는처럼 실제로 소리 : 당신은 모든 하위 프로세스가 완료 될 때까지 대기 할 경우, (검증되지 않은) 같은 것을 multiprocessing.Process를 호출 결과를 저장하고 별도의 루프에서이 값에 가입 달성하기 위해 모든 프로세스가 동시에 시작되고 실행되도록하고 (일부 처리 시간을 절약하기 위해), 결국에는 모든 프로세스가 완료 될 때까지 기다려야합니다. 매우 특별합니다. "맨 마지막에"Job Finished "라는 메시지가있는 경우, 8 또는 N 프로세스가 모두 완료된 경우에만 표시되어야합니다. – codeKiller

관련 문제