2016-08-24 2 views
2

그래서 병렬 처리 방식의 4-5 프로세스 풀을 사용하려는 Python에서 다중 처리를 구현하려고합니다. 이것의 목적은 1000 번을 실행하는 대신 총 1000 번의 몬테 시뮬레이션 (프로세스 당 250-200 시뮬레이션)을 실행하는 것입니다. 각 프로세스는 완료된 처리가 끝나 자마자 잠금을 획득하여 공통 공유 배열에 쓰기를 원합니다. 하나의 시뮬레이션 결과, 결과 작성 및 잠금 해제.다중 처리 - 공유 배열

  1. 획득 잠금 장치 배열에 쓰기를 기다리는 다른 프로세스
  2. 쓰기 결과
  3. 릴리스 잠금 : 그래서는 세 단계의 과정이어야한다.

매번 프로세스에 배열을 전달할 때마다 각 프로세스는 공통 배열을 원하기 때문에 원하는 배열을 복사하지 않습니다. 누구든지 샘플 코드를 제공하여이 문제를 해결할 수 있습니까?

+0

일부 답변을 검색하면 많은 샘플 코드가 생성됩니다. 당신이 당신의 일부를 제공하지 않으면, 우리는 당신을 도울 수 없을 것입니다. Btw, 스레드를 잠 그려면 [semaphores] (https://docs.python.org/2/library/threading.html#semaphore-objects)를 사용하십시오. – Raskayu

+0

[예제] (https : //docs.python .org/3/library/multiprocessing.html # 공유 상태 - 프로세스 간) 공식 문서에 있습니까? – mata

+0

시뮬레이션이 진행되는 동안 어레이에 액세스해야합니까? 그렇지 않다면'Pool.map' 함수를 사용할 수 있습니다. – Dunes

답변

0

테스트를 거치지는 않았지만 그와 같은 것이 작동해야합니다. 배열과 잠금은 프로세스간에 공유됩니다.

from multiprocessing import Process 

def f(array,lock): 
    lock.acquire() 
    #modify array here 
    lock.release() 

if __name__ == '__main__': 
    size=100 
    multiprocessing.Array('i', size) #c type array 
    lock=multiprocessing.Lock() 
    p = Process(target=f, args=(arr,lock,)) 
    q = Process(target=f, args=(arr,lock,)) 
    p.start() 
    q.start() 
    q.join() 
    p.join() 

문서 여기 https://docs.python.org/3.5/library/multiprocessing.html 경우에만 다음 공유 배열을 사용하여 명시 적으로 잠금 장치, 부모 프로세스로 자식 프로세스에서 상태를 과잉되어 반환하고 있기 때문에

+0

공유 배열이 아닙니다. 하위 프로세스에서이 값을 변경해도 상위에는 영향을주지 않습니다. – mata

+0

@mata가 공유 배열을 수정했습니다. – Julien

+2

또한 [Array] (https://docs.python.org/3/library/multiprocessing.html#multiprocessing.Array)는 기본적으로 잠금 장치가 첨부되어 만들어지며 그것의'get_lock()'메소드는 다른 잠금 유형을 사용하기를 원치 않는 한 그것을 명시 적으로 할당 할 필요가 없다. 그러면 시체는'array.get_lock() : ... '과 같이 될 수 있습니다. – mata

0

시작하는 예는 많이있다. Pool.map 또는 Pool.starmap을 사용하여 필요한 것을 정확히 수행 할 수 있습니다. 예 :

from multiprocessing import Pool 

class Adder: 
    """I'm using this class in place of a monte carlo simulator""" 

    def add(self, a, b): 
     return a + b 

def setup(x, y, z): 
    """Sets up the worker processes of the pool. 
    Here, x, y, and z would be your global settings. They are only included 
    as an example of how to pass args to setup. In this program they would 
    be "some arg", "another" and 2 
    """ 
    global adder 
    adder = Adder() 

def job(a, b): 
    """wrapper function to start the job in the child process""" 
    return adder.add(a, b) 

if __name__ == "__main__": 
    args = list(zip(range(10), range(10, 20))) 
    # args == [(0, 10), (1, 11), ..., (8, 18), (9, 19)] 

    with Pool(initializer=setup, initargs=["some arg", "another", 2]) as pool: 
     # runs jobs in parallel and returns when all are complete 
     results = pool.starmap(job, args) 

    print(results) # prints [10, 12, ..., 26, 28]