Применить многопроцессорный пул к функции, которая принимает несколько списков в качестве аргумента - PullRequest
0 голосов
/ 14 января 2020

У меня есть следующая функция:

def match_keywords(reviews_match, nlu_match, keywords_match):

    for j in range(df_NLU_Reviews.shape[0]):
        if((j%1000)==0):
            print(j)

        keywords = df_NLU_Reviews.Keywords.iloc[j]

        for i in range(len(sentences)):

            try:

                counter=0

                for keyword in keywords:
                    if(keyword in sentences[i]):
                        counter+=1

                if( (len(keywords)) == counter ):
                    reviews_match.append(sentences[i])
                    nlu_match.append(df_NLU_Reviews.NLU_Review.iloc[j])
                    keywords_match.append(df_NLU_Reviews.Keywords.iloc[j])
                    sentences.remove(sentences[i])
                    break
            except Exception as e:
                print(i)
                print(j)
                raise e

    df_match = pd.DataFrame()
    df_match['Reviews'] = reviews_match
    df_match['NLU'] = nlu_match
    df_match['Keywords'] = keywords_match
    df_match.to_pickle("Match_Reviews.pkl")

    return df_match

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

Я хочу распараллелить, используя multiprocessing.Pool, но я не могу понять, как это сделать.

Я пробовал это:

reviews_match = []
nlu_match = []
keywords_match = []

match_list = [reviews_match, nlu_match, keywords_match]

if __name__ == '__main__':

    with Pool(processes = 12) as pool:

        results = pool.map(match_keywords, zip(reviews_match, nlu_match, keywords_match))

    print(results)

это:

reviews_match = []
    nlu_match = []
    keywords_match = []

    match_list = [reviews_match, nlu_match, keywords_match]

    if __name__ == '__main__':

        with Pool(processes = 12) as pool:

            results = pool.map(match_keywords, zip(match_list))

        print(results)

и это тоже:

reviews_match = []
    nlu_match = []
    keywords_match = []

    match_list = [reviews_match, nlu_match, keywords_match]

    if __name__ == '__main__':

        with Pool(processes = 12) as pool:

            results = pool.starmap(match_keywords, zip(reviews_match, nlu_match, keywords_match))

        print(results)

Но ничего из этого не работает, эти методы выдают ошибки или пустые списки в качестве вывода. Если я запускаю эту функцию без распараллеливания следующим образом:

match_keywords(reviews_match, nlu_match, keywords_match)

Она работает просто отлично. Может кто-нибудь показать мне правильный способ сделать это и объяснить мне, почему это не работает?

Заранее большое спасибо

1 Ответ

1 голос
/ 14 января 2020

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

Но я думаю, вы не можете распараллелить его таким образом, потому что он не равен запуску

match_keywords(reviews_match, nlu_match, keywords_match)

во многих потоках, равно запуску:

match_keywords(reviews_match[0], nlu_match[0], keywords_match[0])
match_keywords(reviews_match[1], nlu_match[1], keywords_match[1])
match_keywords(reviews_match[2], nlu_match[2], keywords_match[2])
match_keywords(reviews_match[3], nlu_match[3], keywords_match[3])
...

много раз.

...