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

多进程Worker Pool分配至不同函数调用的问题求助

问题分析

你当前的代码是串行执行四个starmap/map调用:先跑完velo的3个任务,再跑velo_grad的3个,接着是vort和vort_grad的任务。同一时间只有一组函数的任务在占用Worker,所以最多同时运行3个Worker(对应每个函数的3组输入),完全没用到8核的全部资源。

解决方案

把所有函数的任务打包成一个统一的任务列表,让Pool一次性处理所有任务,这样8个Worker可以同时处理不同函数的任务,充分利用多核资源。

步骤1:定义任务包装函数

用来统一调用不同的目标函数:

def task_wrapper(func, *args):
    return func(*args)

步骤2:整理所有任务

将四个函数的输入都转换成(目标函数, 参数)的格式,合并成一个大任务列表:

# 整理velo的任务(Gamma_velo的每个元素是velo的多参数,用*args展开)
velo_tasks = [(velo, *args) for args in Gamma_velo]
# 整理velo_grad的任务
velo_grad_tasks = [(velo_grad, *args) for args in Gamma_velo_grad]
# 整理vort的任务(Gamma_vort的每个元素是单个参数)
vort_tasks = [(vort, arg) for arg in Gamma_vort]
# 整理vort_grad的任务
vort_grad_tasks = [(vort_grad, arg) for arg in Gamma_vort]

# 合并所有任务(共4×3=12个任务)
all_tasks = velo_tasks + velo_grad_tasks + vort_tasks + vort_grad_tasks

步骤3:用8进程Pool批量处理所有任务

指定processes=8启用8个Worker,一次性处理所有任务,最后拆分结果:

from multiprocessing import Pool

if __name__ == "__main__":
    # 初始化8进程的Pool
    with Pool(processes=8) as pool:
        # 批量执行所有任务
        all_results = pool.starmap(task_wrapper, all_tasks)
    
    # 按原函数拆分结果
    velo_results = all_results[:3]
    velo_grad_results = all_results[3:6]
    vort_results = all_results[6:9]
    vort_grad_results = all_results[9:12]
    
    # 还原原代码的变量格式
    u1, u2, u3 = velo_results
    ux, uy, uz = zip(*velo_grad_results)
    omega1, omega2, omega3 = vort_results
    omegax, omegaz, omegay = zip(*vort_grad_results)

关键说明

  • 这样所有12个任务会被放入Pool的任务队列,8个Worker会同时拉取任务执行,不管任务属于哪个函数,最大化利用8核资源。
  • if __name__ == "__main__":是Windows系统下的强制要求,避免多进程启动时的递归导入问题,Linux/macOS也建议加上以保证兼容性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 20:20:19