Как сказал Рэймонд и парадигматик, но также, если вы хотите избежать истощения пула потоков, вы должны заключить любые операции блокировки в scala.concurrent.blocking
.
Конечно, лучше избегать блокирующих операций, но иногда вам нужно использовать библиотеку, которая блокирует. Если вы закроете указанный код в blocking
, это позволит контексту выполнения знать, что вы, возможно, блокируете этот поток, чтобы он мог выделить другой, если это необходимо.
Проблема хуже, чем описывает парадигма, поскольку, если у вас есть несколько операций блокировки, вы можете в конечном итоге заблокировать все потоки в пуле потоков и не иметь свободных потоков. Вы можете оказаться в тупике, если все ваши потоки заблокированы из-за чего-то, что не произойдет, пока не будет назначен другой актер / будущее.
Вот пример:
import scala.concurrent.blocking
...
Future {
val image = blocking { load_image_from_potentially_slow_media() }
val enhanced = image.enhance()
blocking {
if (oracle.queryBetter(image, enhanced)) {
write_new_image(enhanced)
}
}
enhanced
}
Документация здесь .