0

그라데이션 디센트 (정확히 100 번 반복)를 수행하고 있습니다. 각 데이터 포인트를 병렬로 분석 할 수 있으며 50 개의 데이터 포인트가 있습니다. 4 코어가 있으므로 multiprocessing.Pool을 사용하여 4 명의 직원 풀을 만듭니다. 기능 train_go_crf에 대한멀티 프로세싱을 사용할 때 잘못된 출력이 발생했습니다.

# Read the sgf files (total 50) 
(intermediateBoards, finalizedBoards) = read_sgf_files() 

# Create a pool of processes to analyze game boards in parallel with as 
# many processes as number of cores 
pool = Pool(processes=cpu_count()) 

# Initialize the parameter object 
param = Param() 

# maxItr = 100 iterations of gradient descent 
for itr in range(maxItr): 
    args = [] 
    # Prepare argument vector for each file 
    for i in range(len(intermediateBoards)): 
     args.append((intermediateBoards[i], finalizedBoards[i], param)) 
    # 4 processes analyze 50 data points in parallel in each iteration of 
    # gradient descent 
    result = pool.map_async(train_go_crf_mcmc, args) 

지금, 나는이 포함되지 않은 정의를하지만, 함수의 첫 번째 줄은 인쇄 성명 :이 프로그램의 핵심은 다음과 같습니다. 그래서이 함수를 실행할 때 print 문은 100 * 50 번 실행되어야합니다. 하지만 그런 일은 일어나지 않습니다. 더 많은 것은 인 무엇, 나는 다른 수의 콘솔 출력을 다른 횟수로 얻는다.

은 어떤 문제가 있습니까?

+1

문제가'map_ascync '이 (가) 비 차단이라고 의심됩니다. 'map'을 대신 사용하면 제대로 동작합니까? – tacaswell

+0

@tcaswell : 당신이 옳다고 생각합니다. 그런 다음 모든 비동기 호출이 실행을 끝내는 동안 몇 초 동안 주 프로세스를 일시 중단하는 간단한 sleep() 함수를 추가하면됩니다. – abhinavkulkarni

+0

표시하지 않는 코드 줄에서'AsyncResult' 객체에 대해'get'을 호출합니까? – Jared

답변

1

map 대신 map_async을 사용하고 있습니다. 즉, 일단 모든 작업이 풀로 구성되면 모든 작업이 완료되지 않은 경우에도 계속 반복됩니다. 다음 루프가 시작될 때 여전히 실행중인 작업에 어떤 일이 일어날 지 명확하지 않지만, 반복으로 간주된다면 a) good b) well-defined라고 상상할 수 없습니다.

map을 사용하면 작업자 기능의 이 모두 완료 될 때까지 루프가 차단되어 다음 단계로 넘어갑니다. 나는 당신이 sleep으로 이것을 할 수 있다고 생각하지만, 그것은 단지 더 많은 이득을 위해 일을 더 복잡하게 만들 것입니다. map이 정확히 일 때 모든 것이 끝나기까지 필요한 최소 시간을 기다립니다.

관련 문제