2016-10-04 3 views
0

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

def get_version_list(env): 
    list = [] 
    #do some intensive work 
    return list 

from multiprocessing import Pool 

pool = Pool() 

result1 = pool.apply_async(get_version_list, ['prod']) 
result2 = pool.apply_async(get_version_list, ['uat']) 
#etc, I have six environment to check. 

alist = result1.get() 
blist = result2.get() 

Это не работает (не уверен синтаксиса вызова функции, но я попробовал другие вещи, без особого успеха), он дает мне ошибку (и повторяет это много, так как моя интенсивная работа делает около 300 request.post).

RuntimeError: Попытка запуска нового процесса до текущего процесса завершила этап начальной загрузки.

This probably means that you are on Windows and you have 
forgotten to use the proper idiom in the main module: 

    if __name__ == '__main__': 
     freeze_support() 
     ... 

The "freeze_support()" line can be omitted if the program 
is not going to be frozen to produce a Windows executable. 
+0

Какая часть сообщения об ошибке было неясно? – martineau

+0

Думаю, я не читал это правильно ... Может, мне пора идти домой. – Amaranth

+1

Извините, если мой комментарий звучал суровым. Важно понимать, как многопроцессорная обработка работает в Windows. Каждый процесс импортирует основной скрипт, который также обычно содержит основной процесс. Вот почему деление его на 'if __name__ == '__main __':' важно (поэтому основная часть не выполняется повторно при каждом возникновении). – martineau

ответ

1

Вы должны поместить часть многопроцессорной внутри вашей основной функции, как:

def get_version_list(env): 
    list = [] 
    print "ENV: " + env 
    return list 


if __name__ == '__main__': 
    from multiprocessing import Pool 

    pool = Pool() 

    result1 = pool.apply_async(get_version_list, ['prod']) 
    result2 = pool.apply_async(get_version_list, ['uat']) 
    #etc, I have six environment to check. 

    alist = result1.get() 
    blist = result2.get() 
+0

Да, это решило сообщение об ошибке – Amaranth

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