прерывание scala параллельный сбор - PullRequest
0 голосов
/ 07 августа 2020

Есть ли способ прервать параллельное вычисление коллекции в Scala?

Пример:

val r = new Runnable {
  override def run(): Unit = {
    (1 to 3).par.foreach { _ => Thread.sleep(5000000) }
  }
}
val t = new Thread(r)
t.start()
Thread.sleep(300) // let them spin up
t.interrupt()

Я бы ожидал, что t.interrupt прервет все потоки, порожденные par, но этого не происходит, продолжает крутиться внутри ForkJoinTask.externalAwaitDone. Похоже, этот метод очищает состояние прерывания и продолжает ждать, пока порожденные потоки завершат sh.

Это Scala 2,12

1 Ответ

2 голосов
/ 07 августа 2020

Поток, который вы t.start() отвечает только за запуск параллельных вычислений, а также за ожидание и сбор результата.

Он не связан с потоками, которые выполняют вычисления. Обычно он работает по умолчанию forkJoinPool, независимо от потока, который отправляет вычислительные задачи.

Если вы хотите прервать вычисление, вы можете использовать настраиваемый серверный модуль выполнения (например, созданный вручную forkJoinPool или threadPool), а затем выключите его. Вы можете прочитать об этом здесь .

Или вы можете предоставить обратный вызов из вычислений.

Но все эти подходы не так хороши для такого случая.

Если вы создаете производственное решение или ваш случай сложен и важен для приложения, вам, вероятно, следует использовать что-то, что имеет отмену по умолчанию. Например, Monix.Task или CancellableFuture.

Или, по крайней мере, используйте Future и отмените его с помощью обходных путей .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...