DoCPLEX:如果 2 个解决方案之一完成,则终止解决方案
DoCPLEX: Kill Solve if one of 2 solves are complete
我正在处理 DoCplex 问题,其中我有 2 个模型。我正在使用 ThreadPoolExecutor() 运行 并行求解。但是,一旦其中一个解决方案完成,是否有可能杀死其中一个解决方案?
我正在使用以下代码:
def work(slvr):
print("This is worker", slvr)
# do stuff
mdl= slvr.solve(clean_before_solve=True,log_output=True)
return mdl
with concurrent.futures.ThreadPoolExecutor() as executor:
future_to_area = {executor.submit(work, slvr): slvr for slvr in a}
for future in concurrent.futures.as_completed(future_to_area):
id = future_to_area[future]
我认为这与 docplex 无关,但它是一个更普遍的问题:运行 多个线程,如何在第一个线程完成后立即终止所有剩余线程?
这样做的一个选择是创建一个额外的线程来接收 future_to_area
映射(因此必须在 在 所有 docplex 线程提交后创建) .同时创建一个受条件变量保护的变量 winner
。一旦 docplex 线程完成,它将 winner
设置为其 id 或 future 并向条件变量发出信号。
附加线程等待条件变量,除非 winner
变为非 None
。一旦这不是 None
,它就知道其中一个 docplex 线程已完成。此时,如果通过在各自的未来调用 cancel()
来停止 future_to_area
中的所有其他线程。
我正在处理 DoCplex 问题,其中我有 2 个模型。我正在使用 ThreadPoolExecutor() 运行 并行求解。但是,一旦其中一个解决方案完成,是否有可能杀死其中一个解决方案? 我正在使用以下代码:
def work(slvr):
print("This is worker", slvr)
# do stuff
mdl= slvr.solve(clean_before_solve=True,log_output=True)
return mdl
with concurrent.futures.ThreadPoolExecutor() as executor:
future_to_area = {executor.submit(work, slvr): slvr for slvr in a}
for future in concurrent.futures.as_completed(future_to_area):
id = future_to_area[future]
我认为这与 docplex 无关,但它是一个更普遍的问题:运行 多个线程,如何在第一个线程完成后立即终止所有剩余线程?
这样做的一个选择是创建一个额外的线程来接收 future_to_area
映射(因此必须在 在 所有 docplex 线程提交后创建) .同时创建一个受条件变量保护的变量 winner
。一旦 docplex 线程完成,它将 winner
设置为其 id 或 future 并向条件变量发出信号。
附加线程等待条件变量,除非 winner
变为非 None
。一旦这不是 None
,它就知道其中一个 docplex 线程已完成。此时,如果通过在各自的未来调用 cancel()
来停止 future_to_area
中的所有其他线程。