You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Pool.map与Pool.starmap时CPU核心利用率差异问题

多进程Pool使用starmap/partial无法并行的问题

我需要用multiprocessing.Pool将任务分配给n个工作进程:

  • 使用单参数任务函数配合map方法时,所有CPU核心均可被利用,任务会同时启动;
  • 但使用starmap传递多参数时,任务逐个启动,CPU始终无法达到100%负载。

由于必须给任务传递第二个参数,我需要用starmap或类似方式,但目前无法发挥多进程的并行优势。以下是可行与不可行的代码示例,尝试functools.partial的方案也未实现有效并行:

可行代码

import numpy as np
from multiprocessing import Pool

# df_a = 一个被拆分为n份的pandas DataFrame,每份含数千行
n_jobs = 16

def run_parallel(df_a):
    dfs_a = np.array_split(df_a, n_jobs)
    print("done split")
    pool = Pool(n_jobs)
    result = pool.map(task_function, dfs_a)
    return result

def task_function(left_df):
    print("in task function")
    # 执行任务...
    return result

result = run_parallel(df_a)

此示例中,"in task function"会被同时打印16次,CPU能满负载运行。

不可行代码

n_jobs = 16

# df_b: 一个大型pandas DataFrame(约170万行、20列),需完整传入每个任务

def run_parallel(df_a, df_b):
    dfs_a = np.array_split(df_a, n_jobs)
    print("done split")
    pool = Pool(n_jobs)
    result = pool.starmap(task_function, zip(dfs_a, repeat(df_b)))
    return result

def task_function(left_df, right_df):
    print("in task function")
    # 执行任务
    return result

result = run_parallel(df_a, df_b)

此示例中,"in task function"会被顺序打印,CPU无法达到满负载。

尝试以下基于partial的方案同样无效:

from functools import partial

pool.map(partial(task_function, b=df_b), dfs_a)

内容的提问来源于stack exchange,提问作者tzoukritzou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 06:15:13