Почему у меня другой результат использования пула мультипроцессинга в Python? - PullRequest
0 голосов
/ 10 ноября 2019

У меня есть эта функция, которая возвращает словарь с именами элементов списка, как показано здесь:

lista =['GILDIKNK','MENIA']
dic={}

def nome_arquivos(lista_fragmentos):
    for elemento in lista_fragmentos:
        indice = "fragmento_" + str(lista_fragmentos.index(elemento)+1)
        dic[indice] = elemento
    print(dic)

nome_arquivos(lista)

В данном случае вывод (и это то, что я хочу):

{'fragmento_1': 'GILDIKNK', 'fragmento_2': 'MENIA'}

Тем не менее, я пытаюсь вставить многопроцессорность, для больших проблем. Это мой код:

from multiprocessing.pool import ThreadPool
import time

lista =['GILDIKNK','MENIA']
dic={}

def nome_arquivos(lista_fragmentos):
    for elemento in lista_fragmentos:
        indice = "fragmento_" + str(lista_fragmentos.index(elemento)+1)
        dic[indice] = elemento
    print(dic)

def pool_handler():
    pool = ThreadPool(4)
    results = pool.map(nome_arquivos, lista)


if __name__ == '__main__':
    pool_handler()

Вывод:

{'fragmento_1': 'G', 'fragmento_2': 'I', 'fragmento_3': 'L', 'fragmento_4': 'D',
'fragmento_6': 'K', 'fragmento_7': 'N'}{'fragmento_1': 'M', 'fragmento_2': 'E',
'fragmento_3': 'N', 'fragmento_4': 'I', 'fragmento_6': 'K', 'fragmento_7': 'N',
'fragmento_5': 'A'}

Что я делаю не так?

1 Ответ

1 голос
/ 10 ноября 2019

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

def proc_names(names_lst):
    return {f'fragmento_{idx}': curr_name for idx, curr_name in enumerate(names_lst, start=1)}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...