python - 为什么在 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'}
我究竟做错了什么?
解决方案
关于为什么您的代码不起作用已经有一些很好的评论,所以我想我会尝试重写您的第一个函数(没有任何多处理的函数)。它本身应该足够高效,如果多处理成为必要,我会感到惊讶。
def proc_names(names_lst):
return {f'fragmento_{idx}': curr_name for idx, curr_name in enumerate(names_lst, start=1)}
推荐阅读
- c++ - 错误:C2065:'QTcpSocket':未声明的标识符
- node.js - Electron 无法正确安装,请删除 node_modules/electron 并重新尝试安装。会不会是版本冲突?
- javascript - 使用 fetch 时在浏览器控制台中处理错误消息
- android - 为 build.gradle 使用 Kotlin 和 buildSrc 不会显示可用的库版本更新?
- php - 我如何制作一个将数据添加到数据库的 php 页面,如果数据已经存在,则将其删除?
- excel - 以独特的字母顺序自定义排序
- laravel - ErrorException 视图中未定义的变量数据
- swift - Swift 删除数组括号和双引号
- android - 如何在颤动中将列表对象发布到 Cloud Firestore Firebase
- excel - 需要 VBA 代码在 Excel 中绘制一系列线性数据,为每个系列创建回归方程,然后在 Excel 表中写入回归方程