【问题标题】:Generate and merge data with python multiprocessing使用 python 多处理生成和合并数据
【发布时间】:2010-04-17 18:59:15
【问题描述】:

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

顺序版本本质上是:

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 来生成。 每个进程只会把它创建的东西放在上面,当进程在减少数据时,他们可以从队列中获取数据。

但我不确定如何减少不同的进程循环并在没有任何竞争条件或其他问题的情况下对其进行修改。

安全执行此操作的最佳方法是什么?还是有其他方法可以更好地实现这一目标?

【问题讨论】:

    标签: python parallel-processing multiprocessing


    【解决方案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()”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-02
      • 2015-07-06
      • 1970-01-01
      • 2018-12-06
      • 1970-01-01
      • 2013-08-18
      相关资源
      最近更新 更多