具有两个参数的函数的多处理(池)

Multiprocessing (Pool) on a function with two arguments

所以我有一个函数,它只需要两个参数就可以对几个 .txt 文件执行一些操作。它目前正在按预期工作,但我在将近一个小时内完成了大约 10% 的内容 - 所以这需要一些时间,因为 .txt 文件相当大。

现在,我一直在阅读有关包 multiprocessing 的信息,尤其是其中的 Pool 部分。但是,我不太确定如何正确使用它。

我用来 运行 我的函数的代码如下:

for k, structure in enumerate(structures):
    structure_maker(structure_path, structure)

structure_path总是相同的,而structures是不同值的列表,例如:

structures = [1, 3, 6, 7, 8, 10, 13, 25, 27]

那么我将如何使用 Pool 进程呢? 据我所知,我必须做类似的事情:

from multiprocessing import Pool

mypool = Pool(6) # Choosing how many cores I want to use
mypool.map(structure_maker, list)

list 是我迷路的地方。那应该是什么? structures 列表,如果是,我应该把 structure_path 放在哪里?

您可能需要制作和解压 tuple

def structure_maker_proxy(args):
    structure_path, structure = args
    structure_maker(structure_path, structure)


from multiprocessing import Pool

mypool = Pool(6) # Choosing how many cores I want to use

lis = [(structure_path, struct) for struct in structures]
mypool.map(structure_maker_proxy, lis)

Pool.map() 函数的工作方式类似于内置的 map() 函数,换句话说,它将传递给它的函数作为参数应用到传递给的可迭代对象中的每个项目它作为第二个参数。每次调用提供的函数时,它都会将可迭代对象中的下一项作为函数的 单个 参数提供。

这种情况下的一个潜在问题是您要使用的函数 structure_maker() 需要两个参数。有不同的方法解决这个问题,但在这种情况下,由于其中一个参数始终是相同的东西,您可以使用 functools.partial() 函数创建只需要将第二个参数传递给它的临时函数——并且您可以在 mypool.map() 调用中直接完成。

我的意思是:

from multiprocessing import Pool

def structure_maker(structure_path, structure):
    """ Dummy for testing. """
    return structure_path, structure

if __name__ == '__main__':

    from pprint import pprint
    from functools import partial

    mypool = Pool(4)
    structure_path = 'samething'
    structures = [1, 3, 6, 7, 8, 10, 13, 25, 27]
    results = mypool.map(partial(structure_maker, structure_path), structures)
    pprint(results)

输出:

[('samething', 1),
 ('samething', 3),
 ('samething', 6),
 ('samething', 7),
 ('samething', 8),
 ('samething', 10),
 ('samething', 13),
 ('samething', 25),
 ('samething', 27)]