DoCPLEX:如果两个解算中的一个已完成,则终止解算



我正在处理DoCplex问题,其中我有两个模型。我正在使用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线程已经完成。此时,if通过在相应的将来调用cancel()来停止future_to_area中的所有其他线程。

相关内容

最新更新