Timefold / Optaplanner 变量侦听器并发问题

问题描述 投票:0回答:1

我有一个正在运行的解决方案,我们使用 Timefold 实现了一种多链模型。在我们的模型中,每个规划实体都有多个规划变量。这些变量使用变量监听器链接起来,以确保当一个变量发生变化时,该实体和所有其他相关实体对应的影子变量都会相应更新。

但是,我们遇到了一个问题。当框架调用 afterVariableChanged() 方法并且我们开始更改值时,在我们退出 afterVariableChanged 方法之前,一个或多个实体有时会被框架更改其值。这种意外的行为使模型不稳定,因为我们不能总是保证回滚到完全相同的状态。

为了解决这个问题,我们在进入 afterVariableChanged() 时插入了一个同步锁。只要我们在单个 CPU 上运行,这就解决了部分问题。然而,我们现在在求解和调用 SolverManager 获取状态时偶尔会遇到死锁,因为框架内似乎有其他锁与我们的同步锁冲突。

还有其他人遇到过这个问题吗?有没有更好的方法来确保在 afterVariableChanged() 中处理模型时的稳定状态而不使用同步或其他锁?另外,有没有办法在调用 SolverManager 之前检查状态以确保它不会死锁?

预先感谢您的帮助!

optaplanner timefold
1个回答
0
投票

变量侦听器在 ScoreDirector 的工作解决方案上运行。 单线程本身就有工作解决方案,即使是多线程解决方案也是如此。

除非计划克隆出现某种混乱(使用@DeepPlanningClone修复),否则不可能在同步上出现死锁,因为所有内容都来自同一个线程。变量监听器调用中不需要使用synchronized关键字。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.