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

Viv*_*Viv 9 python multithreading threadpool python-multiprocessing

我正在使用 Pool 多线程我的程序,使用 starmap 来传递参数。

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

pool = Pool(NO_OF_PROCESSES)
branches = pool.starmap(fetch_api, zip(repeat(project_name), api_extensions))
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

isa*_*ndi 10

您可以围绕pool.starmap它创建一个包装器,该包装器也接受一个超过 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)
Run Code Online (Sandbox Code Playgroud)

然后你可以在你的情况下调用它:

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)
Run Code Online (Sandbox Code Playgroud)

  • 我认为该函数应该命名为“starstarmap”:) (5认同)