2010-04-17 13 views
2

시작 데이터 목록이 있습니다. 시작 데이터의 각 요소에 대해 몇 가지 새로운 데이터를 만드는 시작 데이터에 함수를 적용하려고합니다. 새 데이터의 일부 조각은 동일하므로 제거하고 싶습니다. 파이썬 다중 처리로 데이터 생성 및 병합

순차 버전

은 본질적으로 :

def create_new_data_for(datum): 
    """make a list of new data from some old datum""" 
    return [datum.modified_copy(k) for k in datum.k_list] 

data = [some list of data] #some data to start with 

#generate a list of new data from the old data, we'll reduce it next 
newdata = [] 
for d in data: 
    newdata.extend(create_new_data_for(d)) 

#now reduce the data under ".matches(other)" 
reduced = [] 
for d in newdata: 
    for seen in reduced: 
     if d.matches(seen): 
      break 
    #so we haven't seen anything like d yet 
    seen.append(d) 

#now reduced is finished and is what we want! 

내가 멀티로이 속도를합니다.

나는 멀티 프로세싱을 사용할 수 있다고 생각하고있었습니다. 세대를위한 비용. 각 프로세스는 작성한 항목을 넣을뿐 아니라 프로세스가 데이터를 줄이면 큐에서 데이터를 가져올 수 있습니다.

하지만 다른 프로세스 루프를 줄이고 수정하거나 수정하지 않아도됩니다.

이것을 안전하게하는 가장 좋은 방법은 무엇입니까? 아니면 더 나은 목표를 달성하기위한 다른 방법이 있습니까?

답변

1

std lib에서 제공되는 다중 처리 잠금 (스레딩 잠금과 유사)을 사용합니다.

Here's an example 표준 문서. 작업이 완료되면

from multiprocessing import Process, Lock 

def f(l, i): 
    l.acquire() 
    print 'hello world', i 
    l.release() 

if __name__ == '__main__': 
    lock = Lock() 

    for num in range(10): 
     Process(target=f, args=(lock, num)).start() 

는 "() mylock.release를"경쟁 조건을 피하기 어떤 수정을하기 전에 "() mylock.acquire"을 호출해야합니다, 그리고합니다.

관련 문제