使用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
相关产品推荐
相关产品推荐

