首页 > 解决方案 > Python 池映射问题 - 列表列表

问题描述

我正在尝试将多处理应用于我的代码。但是,在传递列表列表时我遇到了一个问题。我有以下简化代码

from multiprocessing import Manager, Pool, Process

def preprocess(tsk, passedlist, tsklist):

    tsklist[tsk] = tsk
    passedlist[tsk][0] = tsk

    return tsklist, passedlist


if __name__ == "__main__": 

    Machines = 30
    Tasks = 20
    manager = Manager()

    tsklist = [[] for tsk in range(Tasks)]
    list1 = [[[] for mch in range(Machines)] for tsk in range(Tasks)]
    tsklist = manager.list(tsklist)
    list1 = manager.list(list1)

    pool = Pool(processes = 3)

    opr_list = [(tsk, list1, tsklist) for tsk in range(Tasks)]

    results = list(pool.starmap(preprocess, opr_list))

    tsklist = list(results[0][0])
    list1 = list(results[0][1])

    pool.close()
    pool.join()

    print(tsklist[1])
    print(list1[1][0])

我得到了 list1[1][0] = [] 的输出,虽然它应该是 1。我的代码中是否缺少某些内容?

标签: pythonmultiprocessingpool

解决方案


因为这是创建列表列表的列表。但是您的最终语句print(list1[1][0])只能访问 2 的深度

我缩进了你的列表理解,所以更容易分辨。

list1 = [
    [
        [] for mch in range(Machines)
    ] for tsk in range(Tasks)
]

你的目标是什么——生成空列表的目的是什么,而不是在你去的时候追加?因为可能有更简单的方法。


推荐阅读