2016-08-22 2 views
1

Я пытаюсь сделать дорогостоящую часть моих вычислений pandas параллельной, чтобы ускорить все.Python Multiprocessing using Pool уходит рекурсивно haywire

Я уже успел сделать Multiprocessing.Pool работу с простым примером:

import multiprocessing as mpr 
import numpy as np 

def Test(l): 
    for i in range(len(l)): 
    l[i] = i**2 
    return l 

t = list(np.arange(100)) 
L = [t,t,t,t] 
if __name__ == "__main__": 
    pool = mpr.Pool(processes=4) 
    E = pool.map(Test,L) 
    pool.close() 
    pool.join() 

Никаких проблем здесь. Теперь мой собственный алгоритм является немного более сложным, я не могу разместить его здесь в полной славе и страшным, так что я буду использовать некоторые псевдо-код, чтобы выделить то, что я делаю здесь:

import pandas as pd 
import time 
import datetime as dt 
import multiprocessing as mpr 
import MPFunctions as mpf --> self-written worker functions that get called for the multiprocessing 
import ClassGetDataFrames as gd --> self-written class that reads in all the data and puts it into dataframes 

=== Settings 

=== Use ClassGetDataFrames to get data 

=== Lots of single-thread calculations and manipulations on the dataframe 

=== Cut dataframe into 4 evenly big chunks, make list of them called DDC 

if __name__ == "__main__": 
    pool = mpr.Pool(processes=4) 
    LLT = pool.map(mpf.processChunks,DDC) 
    pool.close() 
    pool.join() 

=== Join processed Chunks LLT back into one dataframe 

=== More calculations and manipulations 

=== Data Output 

Когда я запускаю этот сценарий, происходит следующее:

  1. Он читает данные.

  2. Выполняет все вычисления и манипуляции до утверждения пула.

  3. Внезапно он снова считывает данные, в четыре раза.

  4. Затем он переходит в основной скрипт в четыре раза одновременно.

  5. Все это рекурсивно каскадирует и идет с трудом.

Я прочитал, прежде чем это произойдет, если вы не будете осторожны, но я не знаю, почему это происходит здесь. Мой многопроцессорный код защищен требуемым основным-выражением имени (я на Win7 64), он всего 4 строки, у него есть теги close и join, он вызывает одну определенную рабочую функцию, которая затем вызывает вторую рабочую функцию в петля, вот и все. Насколько я знаю, он должен просто создать пул с четырьмя процессами, вызвать четыре процесса из импортированного скрипта, закрыть пул и подождать, пока все будет сделано, а затем просто продолжить сценарий. На стороне, у меня сначала были рабочие функции в том же скрипте, поведение было одинаковым. Вместо того, чтобы просто делать то, что находится в пуле, кажется, он перезапустил весь скрипт в четыре раза.

Может ли кто-нибудь просветить меня, что может вызвать подобное поведение? Кажется, мне не хватает какого-то принципиального понимания многопроцессорности Python.

Также я не знаю, важно ли это, я нахожусь на виртуальной машине, которая находится на мэйнфрейме моей компании.

Должен ли я использовать отдельные процессы вместо пула?

ответ

1

Мне удалось заставить его работать, включив весь скрипт в файл if __name__ == "__main__":, а не только часть многопроцессорной обработки.

+1

Я считаю, что лучше всего структурировать ваш код в функцию 'main' (и, возможно, разделить эту функцию на более мелкие функции ..., чтобы не иметь 100-строчной функции, которая делает много вещей), то единственная часть кода, которая не является определением класса/функции/переменной, имеет следующий вид: 'if __name__ == '__main__': main()'. Это гарантирует, что многопроцессорная обработка работает по назначению. Также обратите внимание, что глобальные переменные не поддаются поиску, поэтому добавление кода внутри функции обеспечит небольшое увеличение производительности. – Bakuriu

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