Генерируйте и объединяйте данные с помощью многопроцессорной обработки Python - PullRequest
2 голосов
/ 17 апреля 2010

У меня есть список начальных данных. Я хочу применить функцию к начальным данным, которая создает несколько фрагментов новых данных для каждого элемента в начальных данных. Некоторые фрагменты новых данных совпадают, и я хочу их удалить.

Последовательная версия по существу:

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 Ответ

1 голос
/ 17 апреля 2010

Я бы использовал многопроцессорную блокировку (похожую на многопоточную блокировку), которая предоставляется в std lib.

Вот пример из стандартной документации.

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 ()», когда вы закончите.

...