首页 > 解决方案 > 为什么在 Python 中使用池多处理会得到不同的结果?

问题描述

我有这个函数,它返回一个字典,其中包含一个名为的列表元素,如下所示:

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'}

我究竟做错了什么?

标签: pythonmultiprocessing

解决方案


关于为什么您的代码不起作用已经有一些很好的评论,所以我想我会尝试重写您的第一个函数(没有任何多处理的函数)。它本身应该足够高效,如果多处理成为必要,我会感到惊讶。

def proc_names(names_lst):
    return {f'fragmento_{idx}': curr_name for idx, curr_name in enumerate(names_lst, start=1)}

推荐阅读