首页 > 解决方案 > 在 dict 上应用具有多个参数的 pool.starmap() 函数,这些参数都作为 .starmap() 内部的参数传递

问题描述

我目前正在尝试对脚本应用并行处理。以下只是为了模拟我正在处理的当前脚本。基本上,我想在函数和字典上调用 Pool.starmap() 函数。问题是,该函数有多个参数。我不断收到此错误,

TypeError: read_books() 接受 4 个位置参数,但给出了 6 个

我尝试在 pool.starmap(function(arg1, arg2, ar3), dict) 内使用所需的参数调用函数

import multiprocessing as mp
from itertools import product

# dict - key as string, value as a list

library = {
    'horror': ['Book1', 'book2', 'book3'],
    'thriller': ['book3', 'book4', 'book5'],
    'romance': ['book4', 'book5', 'book6']
}

def read_books(group_friends, library_name, amount_of_hours, key):

    for friend in group_friends:
        print(f"friend {group_friends} visits the library to read {key} books")

    print(f"They are all at the library {library_name} and spend a total of {amount_of_hours} there.")


with mp.Pool(processes=len(library)) as pool:
        results = pool.starmap(read_books, library)

我基本上只想为每个键值对执行 3 次 read_books 函数

标签: pythonpython-3.xparallel-processing

解决方案


starmap相当于:

def starmap(func, iterable):
    for elem in iterable:
        yield func(*elem)

在您的情况下iterable是 adict所以它迭代键和它调用的每个键read_books*elem即它为每个字符放置一个参数。所以你最终打电话,例如:

read_books('r', 'o', 'm', 'a', 'n', 'c', 'e')

library应该是这样的,你的代码才能工作:

library = [
    ['horror', 'Book1', 'book2', 'book3'],
    ['thriller', 'book3', 'book4', 'book5'],
    ]'romance', 'book4', 'book5', 'book6']
]

你也可以这样做:

pool.starmap(read_books, ((k, *vals) for k, vals in library.items()))

在现代 python 版本中。

您不能只使用library.items(),因为在这种情况下starmap将只使用两个参数调用该函数:键和值(恰好是一个列表)。


推荐阅读