python - 在 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 函数
解决方案
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
将只使用两个参数调用该函数:键和值(恰好是一个列表)。
推荐阅读
- python - Python:特定搜索并在新文件中输出新项目结果
- python - 使用 os.walk() 重命名文件夹和文件名
- node.js - 了解无服务器框架中计划事件中的输入?
- c# - 为什么不调用后处理方法?
- mysql - Laravel 数据库命令中的多个喜欢
- dialogflow-es - 使用 Google SR 插件和动态语音上下文来提高 Google Cloud Speech-to-text API 和 Dialogflow 的性能
- java - 如何让 Swagger2 使用 ObjectMapper 的 PropertyNamingStrategy (eg SNAKE_CASE)
- javascript - Swagger - 响应验证失败:架构验证失败
- python - Python 3.x _tkinter.TclError:错误的窗口路径名“.!toplevel”
- oauth - Identity Server 4 是否允许通过外部 API 创建用户?