2014-01-09 3 views
0

Хорошо, поэтому я никогда не использовал библиотеку многопроцессорности python, и я действительно не знаю, как записать мой поиск. Я прочитал документы для библиотеки, и я попытался найти примеры своей проблемы, и я ничего не смог найти.
У меня есть список имен файлов (~ 2400), словарь (называемый cond, и является глобальным) и функция. Я хочу запускать свою функцию на каждом процессоре, и каждый раз, когда функция работает, она использует одно из имен файлов в качестве переменной. Поэтому я хочу, чтобы в нем было 4 процесса, 1 для каждого процессора, и он должен пробиваться через список, когда одна из функций заканчивается, он переносит на следующий элемент в списке, и каждая из этих функций будет обновлять один общий словарь.Многопроцессор Python и список переменных, которые должны быть переданы функции

Psudofunction код:

def PSC(fnom): 
    f = open(fnom,"r") 
    r = xml.dom.minidom.parse(f) 
    cond[fnom] = otherfunc(r) 
    f.close() 

Так, а) можно ли использовать мультипроцессирование на эту функцию, и б) если да, то какой метод из многопроцессорной библиотеки сможет справиться с этим, в) если вам очень приятно, как я могу перебирать список, передавая каждый элемент в качестве аргумента каждый раз.

размышления о том, как она будет работать (psudo быков *** код):

if __name__ == __main__: 
    name_list = name_list_func() 
    method = multiprocessing.[method]() #no idea what method 
    method.something(target=PSC, iter=name_list) #no idea either 

ответ

0

Это очень просто, для «один общий словарь» часть кроме. Процессы не разделяют память. Это ложь, но это тот, на котором вы должны сначала поверить ;-) Я буду держать dict в главной программе здесь, потому что это far более эффективно, чем любой фактический способ совместного использования dict через процессы:

NUM_CPUS = None # defaults to all available cores 

def PSC(fnom): 
    return fnom, len(fnom) 

if __name__ == "__main__": 
    import multiprocessing as mp 
    pool = mp.Pool(NUM_CPUS) 
    list_of_strings = list("abcdefghijklm") 
    cond = {} 
    for fnom, result in pool.imap_unordered(PSC, list_of_strings): 
     cond[fnom] = result 
    pool.close() 
    pool.join() 
    print cond 

Это код, который вы действительно можете запустить. Включение всплывающего файла, анализ XML и т. Д. Не изменяет ни одного из того, что вам нужно, чтобы работать с частью многопроцессорной обработки.

В текущем Python 3 это можно сделать немного проще. Код здесь для Python 2.

Обратите внимание, что вместо imap_unordered() вы также можете использовать imap() или map(). imap_unordered() дает реализацию большую свободу для организации вещей настолько эффективно, насколько это возможно, хотя до сих пор реализация на самом деле не достаточно умна, чтобы воспользоваться этим. Забегая вперед ;-)

+0

Спасибо за быстрый ответ, и я пошел с imap_unordered(), и я застрял в 2.7 из-за ArcPy. – Tarkin

Смежные вопросы