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

Gurobi Thread参数与Python多进程配合异常问题求助

问题描述

使用多进程并行求解不同模型时,手动设置Threads参数(计划为两个进程各分配5线程,默认值为16)会导致程序运行异常:首个进程出现长时间停顿,该现象可通过日志确认;保留Threads默认值则程序运行完全正常。

测试环境

  • Windows系统
  • Gurobi 10.02版本
  • Python 3.7/3.9/3.11版本
  • 两台不同电脑测试验证,相同逻辑在CPLEX中可正常运行

相关代码

# always something wrong about this process, but actually another did have the same model just with restricted feasible region
def function():
    with gp.Env() as env, gp.read('1.mps', env) as model:
        model.setParam(GRB.Param.MIPGap, 0)
        model.setParam(GRB.Param.TimeLimit, 900)
        model.setParam('Threads', 5)
        model.optimize()

if __name__ == '__main__':
    multiprocessing.freeze_support()
    pool = multiprocessing.Pool(processes=1)
    pool.apply_async(function)
    pool.close()
    pool.join()

设置Threads参数时的异常日志

H    0     0                    2.569286e+12 2.1687e+12  15.6%     -  106s
     0     0 2.1687e+12    0 2005 2.5693e+12 2.1687e+12  15.6%     -  111s
     0     0 2.1687e+12    0 1645 2.5693e+12 2.1687e+12  15.6%     -  900s

未设置Threads参数时的正常日志

H    0     0                    5.835511e+12 2.1687e+12  62.8%     -  180s
H    0     0                    5.757233e+12 2.1687e+12  62.3%     -  182s
H    0     0                    2.326050e+12 2.1687e+12  6.77%     -  185s
     0     0 2.2055e+12    0 1500 2.3260e+12 2.2055e+12  5.18%     -  280s
     0     0 2.2055e+12    0 1478 2.3260e+12 2.2055e+12  5.18%     -  280s
H    0     0                    2.314108e+12 2.2055e+12  4.69%     -  284s
     0     0 2.2056e+12    0 1458 2.3141e+12 2.2056e+12  4.69%     -  301s

解决方案建议

  • 在环境层面配置线程数:不要在模型实例上设置Threads,而是创建Gurobi环境时直接传入参数,确保每个进程的环境线程配置完全独立:
    def function():
        with gp.Env(params={'Threads':5}) as env, gp.read('1.mps', env) as model:
            model.setParam(GRB.Param.MIPGap, 0)
            model.setParam(GRB.Param.TimeLimit, 900)
            model.optimize()
    
  • 禁用线程绑定:添加model.setParam('ThreadShift', 0)参数,避免线程与特定CPU核心绑定引发的调度冲突,尤其适用于多进程环境。
  • 改用直接创建进程的方式:避免使用multiprocessing.Pool,改用multiprocessing.Process直接创建进程,减少池化带来的资源共享问题:
    if __name__ == '__main__':
        multiprocessing.freeze_support()
        p = multiprocessing.Process(target=function)
        p.start()
        p.join()
    
  • 升级Gurobi版本:Gurobi 10.02可能存在Windows多进程下的线程配置bug,升级到最新稳定版可修复这类兼容性问题。
  • 控制总线程数:确保所有进程的线程总数不超过CPU核心数,避免过度调度导致系统资源竞争,引发进程停顿。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 13:23:12