multithreading - python多线程中的Pyomo实例
问题描述
我正在尝试解决一个随机问题。24 个步骤的问题,在每个步骤中,我解决了 450 个不同的实例。现在可以串行解决问题,但这需要很多时间,所以我想并行解决这 450 个实例。
我通过两种方式解决了这个问题:
使用solver_manager 和多个pyro mip 服务器。在这里,我只需要对实例进行排队,求解器管理器会将问题分配给 pyro mip 服务器。但是 pyro mip 服务器会占用大量内存,即使在计算出最终结果后也会保留它。使用 opt 求解器。a) 我可以直接使用 opt 求解器求解,但速度很慢。b) 使用多线程。我试图用 5 个线程创建一个 threadPoolExecutor,然后在不同的线程中解决这 450 个实例。但只是转向多线程会导致 pyomo 抛出错误。
def optimize():
optsolver = SolverFactory(self.solver_name)
value = self.initialize_all_values()
for timestep in range(24):
instance_list = self.create_instance_list(value)
futures = {}
with concurrent.futures.ThreadPoolExecutor(max_workers=1) as executor:
for instance_object in instance_list:
futures = {executor.submit(self.thread_solver, instance_object["instance"], optsolver, timestep)}
for future in concurrent.futures.as_completed(futures):
try:
result = future.result()
value.update(result)
except Exception as e:
self.logger.error(e)
def thread_solver(instance, optsolver, timestep):
result = optsolver.solve(instance)
if (result.solver.status == SolverStatus.ok) and (
result.solver.termination_condition == TerminationCondition.optimal):
instance.solutions.load_from(result)
my_dict = {}
for v in instance.component_objects(Var, active=True):
varobject = getattr(instance, str(v))
var_list = []
try:
for index in varobject:
var_list.append(varobject[index].value)
my_dict[str(v)] = var_list
except Exception as e:
self.logger.error("error reading result " + str(e))
value = {key: my_dict[k][0]}
return value
elif result.solver.termination_condition == TerminationCondition.infeasible:
self.logger.info("Termination condition is infeasible")
return {}
else:
self.logger.info("Nothing fits")
return {}
我收到以下错误/输出:
没有什么适合 Solver failed to locate input problem file: /usr/src/app/temp/pyomo/tmpn23yhmz_.pyomo.lp 我已将 pyomo 临时文件位置设置为“/usr/src/app/temp/pyomo” 相同的代码在没有多线程的情况下运行得很好。pyomo 没有解决问题的任何理由?
更新 1:当我尝试调用 optsolver.solve(instance) 时,我尝试使用互斥锁。这有助于减少上述错误而不是完全消除。每当发生这些错误时,我都会尝试再次解决该实例,并在第二次尝试中解决它们。所以,多线程确实有效,但我不知道为什么仍然会出现错误。
解决方案
推荐阅读
- keras - 在 Keras 中创建 CNN 模型时出现属性错误
- blazor - blazor - 验证码问题 System.Drawing.Common 不受支持
- azure - 在 Azure Web 应用程序上启用 SSL/HTTPS 的最佳方法是什么
- reactjs - Django/React set-cookie:csrftoken 和 X-CSRF-Token 不匹配并持续存在
- django - 如何在 django 模型中将文件内容作为 CharField 传递?
- powerbi - 将度量用作文本标签而不是数值有什么问题吗?
- react-native - 如何从登录页面获取用户名并在 React Native 的所有页面(组件)上动态使用它
- java - 致命:gpu_data_manager_impl_private.cc(439)] GPU 进程不可用。再见
- windows - 在 git bash(终端或脚本)中将 posix 路径转换为 windows?
- python - 即使我使用的是 readlines(),这些函数只允许我读取第一个非空行而不是之后的行?