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

