在 Python 中使用 Pool 时将 kwargs 传递给 starmap

Pass kwargs to starmap while using Pool in Python

我正在使用 Pool 对我的程序进行多线程处理,使用 starmap 来传递参数。

我被卡住了,因为我似乎无法找到一种方法来传递 kwargs 以及我在 starmap 函数中传递的 zip 数组。

pool = Pool(NO_OF_PROCESSES)
branches = pool.starmap(fetch_api, zip(repeat(project_name), api_extensions))

分支请求不完整,因为我仍然无法弄清楚如何传递关键字参数。

def fetch_api(project_name, api_extension, payload={}, headers={}, API_LINK=API_LINK, key=False):
    headers[AUTH_STRING] = 'Gogo'
    call_api = API_LINK + project_name + api_extension
    response_api = requests.get(call_api, headers=headers, params=payload)

    if key: return project_name + ':' + response_api
    else: return response_api

从分支线调用 fetch_api() 时,我想将有效负载作为 {'a':1} 和 key=True 传递。

请指导我的方向或答案。谢谢。使用 Python 3.3+.

您可以围绕 pool.starmap 创建一个包装器,它也接受 over kwargs 字典的迭代器。

from itertools import repeat

def starmap_with_kwargs(pool, fn, args_iter, kwargs_iter):
    args_for_starmap = zip(repeat(fn), args_iter, kwargs_iter)
    return pool.starmap(apply_args_and_kwargs, args_for_starmap)

def apply_args_and_kwargs(fn, args, kwargs):
    return fn(*args, **kwargs)

然后您可以将其称为您的情况:

args_iter = zip(repeat(project_name), api_extensions)
kwargs_iter = repeat(dict(payload={'a': 1}, key=True))
branches = starmap_with_kwargs(pool, fetch_api, args_iter, kwargs_iter)