Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在Python中使用池多处理会产生不同的结果?_Python_Multiprocessing - Fatal编程技术网

为什么在Python中使用池多处理会产生不同的结果?

为什么在Python中使用池多处理会产生不同的结果?,python,multiprocessing,Python,Multiprocessing,我有一个函数,它返回一个字典,其中包含名为的列表元素,如下所示: 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

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

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

我做错了什么?

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

def proc_名称列表: 返回{f'fragmento{idx}”:idx的curr\u名称,enumeratenames中的curr\u名称,start=1}
映射列表时,将字符串传递给函数,该函数也是可编辑的,因此不会出现错误,但每个字母都在for循环中使用。顺便说一句,对多处理代码使用相同的原始函数是没有意义的。我相信您只需要将代码放入循环中,因为ThreadPool.map函数接受一个iterable,它将每个值的调用映射到函数。因此,每个字符串都作为参数传递给函数。您使用线性搜索索引来查找正在创建的列表中字符串的索引,有什么具体原因吗?@Jason该索引是我发现的根据每个列表元素在字典中创建键的方法。@BrunoSantos您在线性时间内搜索每个函数调用的列表,因此复杂性为^2。使用多处理不会解决效率低下的算法。让函数修改全局变量是有风险的,据我所知,在这里完全可以避免。