Как вы можете сделать импортированные пакеты и глобальные объекты доступными для многопроцессорной обработки. Бассейн в Python и Jupyter Notebooks - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь использовать многопроцессорную работу в Jupyter Notebooks, которую нужно настроить немного иначе, чем обычно.

Пример кода ниже включает рабочий пример с использованием обычного l oop.

Пример многопроцессорной обработки завершается ошибкой, поскольку df и scipy недоступны для функции многопроцессорной обработки.
Т.е.: NameError: name 'df' is not defined.

import scipy
import pandas as pd
import multiprocessing

df=pd.DataFrame(columns=['Col'])
df['Col']=[i for i in range(1,10)]

def enum_indexes():
    for fromrow in df.itertuples(index=True):
        for torow in df.itertuples(index=True):
            yield (fromrow.Index,torow.Index)


#Regular example that works fine.
resultlist=[]
for e in enum_indexes():
    value_1=df.iloc[e[0]]
    value_2=df.iloc[e[1]]
    result= scipy.mean([value_1,value_2])
    resultlist.append(result)


#For multiprocessing to work in Jupyter, it's necessary to have the worker function in a separate module.  
#This function is in my_module.py
def worker_func(e):
    value_1=df.iloc[e[0]]
    value_2=df.iloc[e[1]]
    result= scipy.mean([value_1,value_2])
    return result 

import my_module
resultlist=[]
if __name__ == '__main__':
        pool=multiprocessing.Pool(processes=2)
        for result in pool.imap(my_module.worker_func, enum_indexes()):
            resultlist.append(result)

Я не мог понять, как применить инициализатор пула, но думаю, что это потенциальное решение.

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

Ценю любую помощь,
Спасибо

...