2016-09-23 2 views
0

설명 할 수없는 동작이 있습니다. 이 코드입니다 : I 출력이Python 다중 처리 잠금 이상 동작

melon 
orange 
apple 
melon 

될 것으로 기대

import multiprocessing 
from collections import deque 

LOCK = multiprocessing.Lock() 

data = deque(['apple', 'orange', 'melon']) 

def f(*args): 
    with LOCK: 
     data.rotate() 
     print data[0] 

pool = multiprocessing.Pool() 
pool.map(f, range(4)) 

대신 나는 어떤 아이디어가 크게 감상 할 수

melon 
melon 
melon 

얻을.

+0

'잠금'과 아무 관련이 없습니다. Linux-y 시스템의 각 작업자 프로세스는'Pool'이 생성 될 때 주 프로세스의 주소 공간 ('fork()'에서 읽힌)의 _copy_를 상속받습니다. 따라서 그들은 각각 자신의 '데이터'복사본을 얻습니다. 그리고 어떤 프로세스도 복사를 통해 다른 프로세스의 복사본에 영향을 줄 수 없습니다. –

+0

알겠습니다 ... 고마워요! – giorgosp

답변

1

Tim Peters가 언급했듯이 문제는 Lock이 아니지만 deque은 프로세스간에 공유되지 않지만 모든 프로세스는 자체 복사본을 갖습니다.

multiprocessing 모듈에서 제공하는 일부 데이터 구조가 프로세스간에 공유됩니다 (예 : multiprocessing.Queue. 대신 사용하십시오.

+0

나는 다중 처리를 믿습니다 .Queue는 프로세스 간 통신에 더 적합합니다. 내가 달성하기를 원하는 것은 메모리 내 데이터베이스로 작동하는 공유 메모리 목록을 갖는 것입니다. 더 나은 해결책은 [프로세스 간 공유 상태] (https://docs.python.org/2/library/multiprocessing.html#sharing-state-between-processes) 문서에 있습니다. – giorgosp