2013-12-10 2 views
2

Я много нового в многопроцессорной обработке. Я пытаюсь изменить свой код, чтобы одновременно выполнять часть его.Пример Python и многопроцессорности

У меня есть огромный список, где я должен назвать API для каждого узла. Поскольку API являются независимыми, мне не нужен результат первого, чтобы перейти ко второму. Итак, у меня есть этот код:

def xmlpart1(id): 
    ..call the api.. 
    ..retrieve the xml.. 
    ..find the part of xml I want.. 
    return xml_part1 

def xmlpart2(id): 
    ..call the api.. 
    ..retrieve the xml.. 
    ..find the part of xml I want.. 
    return xml_part2 

def main(index): 
    mylist = [[..,..],[..,..],[..,..],[..,...]] # A huge list of lists with ids I need for calling the APIs 
    myL= mylist[index] c 
    mydic = {} 
    for i in myL: 
     flag1 = xmlpart1(i) 
     flag2 = xmlpart2(i) 
     mydic[flag1] = flag2 

    root = "myfilename %s.json" %(str(index)) 

    with open(root, "wb") as f: 
     json.dump(mydic,f) 

from multiprocessing import Pool 

if __name__=='__main__': 
    Pool().map(main, [0,1,2,3]) 

После нескольких предложений от сюда и из разговора, я заканчиваю с этим кодом. Проблема все еще существует. Я запускаю сценарий в 9:50. В 10:25 в моей папке появился первый файл «myfilename 0.json». Теперь это 11:25, и ни один из других файлов не появился. Подсети имеют равную длину, и они делают то же самое, поэтому им нужно примерно одно и то же время.

+0

Я смущен о том, что вы просите о помощи с здесь. Приведенный код не будет работать, так как код имени [1-4] будет повторно использован (функции не имеют основного метода), а проблема с обработкой выходных данных - в коде, который вы вообще не показывали. –

+0

Теперь лучше. Основная функция - импортные функции. Если я запускаю код в одном скрипте, у меня нет проблемы. Поэтому проблема не в функции main(), а на том, как использовать библиотеку многопроцессорности. – Tasos

+0

Это не многопроцессорная библиотека, которая сохраняет данные. Часть, которая терпит неудачу, не входит в число, которое вы показываете. –

ответ

1

Это что-то более подходящее для класса multiprocessing.Pool().

Вот простой пример:

from multiprocessing import Pool 

def job(args): 
    """Your job function""" 


Pool().map(job, inputs) 

Где:

  • inputs Ваш список входов. Каждый вход передается на задание и обрабатывается отдельным процессом.

Вы получаете результаты назад как список, когда все задания завершены.

multiprocessing.Pool().map точно так же, как встроенный Python map(), но создает для вас пул процессов для работников и передает каждый вход данной функции.

Смотрите документацию для получения более подробной информации: http://docs.python.org/2/library/multiprocessing.html

+0

Если Я сделаю это таким образом, выходной файл будет перезаписан. Я использовал 4 различных функции, чтобы иметь 4 разных имени для выходных json-файлов. – Tasos

+0

Вы производите функцию '' job() '', выводя файлы и записывая их в отдельные файлы. Функция '' job() '' не должна ничего возвращать. –

+0

Большое вам спасибо.Я пробовал с 3 и 4 пулами, но мой четырехъядерный ноутбук замораживался в обоих случаях. Это нормально, и я могу использовать только 2 бассейна? – Tasos

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