2012-02-13 11 views
6

나는 파이썬 문서를 올바르게 따르고 있다고 생각하지만 내가 찾고있는 결과를 얻는데 어려움을 겪고있다. 나는 기본적으로 숫자의 목록을 가지고 있으며, 이는 중첩 된 for 루프의 함수로 전달되며 출력은 사전에 저장됩니다. 내가 잘못 무엇다중 처리로 공유 사전에 어떻게 액세스합니까?

{1: 9801, 2: 9801, 3: 9801, 10: 9801} 

어떤 제안 :

여기
from multiprocessing import Pool, Manager 

list = [1,2,3,10] 
dictionary = {} 
def test(x, dictionary): 
    for xx in range(100): 
     for xxx in range(100): 
      dictionary[x]=xx*xxx 



if __name__ == '__main__': 
    pool = Pool(processes=4) 
    mgr = Manager() 
    d = mgr.dict() 
    for N in list: 
     pool.apply_async(test, (N, d)) 

    # Mark pool as closed -- no more tasks can be added. 
    pool.close() 

    # Wait for tasks to exit 
    pool.join() 

    # Output results 
    print d 

가 예상 결과입니다 : 여기

코드인가? 또한, 공유 된 리소스가 최상의 접근 방식 (데이터베이스를 상태를 유지하기 위해 생각하는 것)이라고 확신하지 못했습니다. 따라서 내 접근 방식에 결함이 있거나 파이썬에서이 작업을 수행하는 더 좋은 방법이 있다면 알려 주시기 바랍니다.

답변

3

변경 test의 정의 :

def test(x, d): 
    for xx in range(100): 
     for xxx in range(100): 
      d[x]=xx*xxx 

그렇지 않으면 당신은 그냥 글로벌 dictionary (동기화없이) 결코 나중에 액세스 증가하고 있습니다.


일반적 접근 방식에 관해서는 특히이 공유 된 사전에 많은 논점이 있다고 생각합니다. 정말로은 각 프로세스에서 바로 업데이트해야합니까? 각 프로세스에서 부분 결과의 일괄 처리를 축적하고 잠시 동안 공유 오브젝트를 업데이트하면 성능이 향상됩니다.

+0

감사합니다. 나는 그렇게 간단한 실수를했다고 생각하지 않습니다. 감사. 일반적인 접근법에 관해서. 내 실제 코드는 기본적으로 기존의 dict 항목을 참조해야하며, 작성해야 할 항목이없는 경우 (그리고 새 루프 내에서 처리하기 위해 존재하는 경우) 필요합니다. 일괄 처리는 나를 위해 특별히 작동하지 않을 것이지만 그 접근법에 대해 알면 좋습니다. 데이터베이스 (또는 파일에 결과 저장)에 대해 생각하고 있었지만 확실하지 않았습니다. – Lostsoul

관련 문제