2016-06-03 4 views
1

다중 처리 스레드간에 사전을 공유하려고합니다 .Pool. 그러나 현재 구현에서는 실패했습니다. 테스트 코드 :다중 처리를 사용하여 스레드간에 사전을 공유하는 방법.

#!/usr/bin/env python 

import multiprocessing 

success_map = {"1": []} 

def run_(input): 
    global success_map 
    successes = success_map.get(input); 
    successes.append(0) 
    print success_map 

pool = multiprocessing.Pool() 
pool.map(run_, ["1"]) 
pool.close() 
pool.join() 
print success_map 

출력은

{'1': [0]} 
{'1': []} 

그것은 나에게 multiprocessing.Pool의 직원 (들) (보이는)이 사전의 복사본을 만드는 것입니다; 그래서 처리가 끝나면 업데이트를 볼 수 없습니다. 내가 맞습니까?

참고 : 나는 run_ 함수에서 값을 반환하고 pool.map(run_, ["1"])의 결과로 수집 된 목록을 얻을 수 있지만 가능한 알고 있어요

  • 현재 작업에 대한 전역 변수를 사용해야하는 것이 가능 알고

    1. 내가 global 문이이 경우에 필요하지 않습니다 어디 선가 읽은 적이 있지만 예는
    2. I가 [["1", success_map]]을 통과 같은 결과를 가지고없이 동일한 방식으로 작동
    3. dataraces pool.map; 전역 변수를 사용하지 않고

    이 예제에서는 스레드간에 success_map을 공유 할 수 있습니까?

    관련,하지만 대답 : Python Multiprocessing appending list

  • 답변

    4

    멀티 별도의 프로세스하지 스레드 사용합니다. 이 프로세스는 스레드처럼 모든 메모리를 공유하지 않습니다.

    ~ share data 프로세스간에 사용할 수 있습니다. multiprocessing.Value 또는 multiprocessing.Array 그러나 일부 cicumstances에서 당신은 need an extra Lock 것입니다 알고 있어야합니다.

    Manager 개체를 사용하면 대부분의 데이터 형식을 공유 할 수 있습니다 (피클 할 수 있어야 함). 그리고 공유 메모리가 더 느립니다.

    또는 multiprocessing.Pipe을 만들어 프로세스간에 데이터를 교환 할 수 있습니다.

    노트

    :

    1. 멀티 프로세싱 모듈 은 가사에 대한 사용 스레드 내부적으로한다.
    2. 일반적으로 프로세스간에 많은 양의 데이터를 보내지 않는 것이 좋습니다.
    관련 문제