Мне нужно выполнить сложные вычисления async и уметь прерывать их в любое время (из-за пределов вычислений).Как отменить асинхронное вычисление в любое время?
В текущей реализации используется scala.concurrent.Future для запуска вычислений. Однако, похоже, нет очевидного способа отменить будущее scala во время исполнения.
Я нашел и попробовал ряд рекомендуемых решений по этой проблеме, например, используя Promise для реализации cancellable Future или с помощью java.util.concurrent.Future, который имеет метод cancel().
Все они имеют одинаковую проблему: выполнение прерывается только при достижении вызова Thread.sleep().
Это проблема по двум причинам:
- Расчеты должны закончить как можно быстрее. Добавление даже очень коротких периодов сна является контрпродуктивным.
- Я не являюсь основным разработчиком этих вычислений, и я хочу избежать необходимости накладывать произвольные ограничения на реализацию вычислений.
«выполнение только прерывается, когда оно достигает Thread.sleep()». Это не правда. Он будет прерван при достижении подходящего кода, который проверяет состояние прерывания потока. – Kayaman
Похоже, что ваши вычисления слишком велики, если вам нужно беспокоиться о прерываниях в середине потока. Вы не говорите, какую рабочую нагрузку у вас есть и как легко это происходит. –
@ChrisMowforth Что вы подразумеваете под «средним потоком» прерываний? Я больше не рассказывал о рабочей нагрузке, потому что это может быть почти все, от простого слова до сложного видеофильтра или симуляции. Я предоставляю среду для выполнения этих вычислений, и я должен уметь их убивать, если это необходимо. Эти вычисления выполняются третьими лицами. – DrummerB