2010-04-17 19 views
2

我有一個開始數據的列表。我想對起始數據應用一個函數,爲起始數據中的每個元素創建幾條新數據。一些新的數據是相同的,我想刪除它們。使用python多重處理生成和合並數據

順序版本基本上是:

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! 

我想多要加快這。

我在想,我可以用一代multiprocessing.Queue。 每個進程只會放置它創建的東西,當進程正在減少數據時,他們只能從隊列中獲取數據。

但我不知道如何讓不同的過程循環減少和修改它沒有任何競爭條件或其他問題。

安全地做到這一點的最佳方法是什麼?或者有更好的方法來完成這個目標嗎?

回答

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.acquire」和「mylock.release()」時,即可大功告成。