一千萬個為什麽

搜索

使用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進行生成。 每個進程只會放置它創建的東西,當進程減少數據時,它們只能從隊列中獲取數據。

但我不確定如何在不出現任何競爭條件或其他問題的情況下將不同的過程循環減少並進行修改。

安全地做到這一點的最佳方法是什麽?或者有更好的方法來更好地實現這一目標嗎?

最佳答案

我會使用std lib中提供的多處理鎖(類似於線程鎖)。

Here's an example from the standard documentation.

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()”。

轉載註明原文: 使用python多處理生成和合並數據