使用python多处理生成和合并数据

时间:2010-04-17 18:59:15

标签: python parallel-processing multiprocessing

我有一份起始数据列表。我想将一个函数应用于起始数据,该起始数据为起始数据中的每个元素创建一些新数据。一些新数据是相同的,我想删除它们。

顺序版本基本上是:

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 个答案:

答案 0 :(得分: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()”。