为什么在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。使用多处理不会解决效率低下的算法。让函数修改全局变量是有风险的,据我所知,在这里完全可以避免。