Как мы все знаем, использование Future в Scala требует объявления контекста выполнения, который создает пул потоков, который используется для запуска кода, который появляется в Future. Мой вопрос, если использование Future.successful или Future.failed пропускает этот запрос в пул потоков. Производительность влияет на правильное использование Future.
Чтобы дать некоторое представление, коллега с многолетним опытом работы с Scala сказал мне, что прямое использование Future () для переноса некоторого блока кода не рекомендуется, потому что для осмысленности код в вызове Future должен иметь потенциал, чтобы бросить исключение, и это нежелательно. В нашей кодовой базе непосредственное создание исключения считается нефункциональным стилем и также влияет на производительность, поскольку создание исключения - это относительно медленная операция с затратами на производительность, и поэтому ее следует избегать. Мой вопрос состоит из двух частей:
1) Я хочу знать, есть ли другие потенциальные последствия избегания прямых вызовов Future (): сохраняет ли использование Future.successful и Future.failed вычислительные ресурсы, не планируя работу над потоком из пула потоков? Создавая уже готовое Future, избегают ли эти две программные конструкции запроса потока из пула потоков?
Чтобы быть конкретными, давайте сравним два блока кода:
а)
val fut = Future(1+1)
и
б)
val fut = Future.successful(1+1)
b) Экономит ли вычислительные ресурсы, не заходя в пул потоков?
2) Кроме того, я также хотел бы знать, запрашивается ли поток из пула потоков при отображении или отображении будущего. Например, я заметил, что любой код, который включает плоскую карту в Future, требует определения контекста выполнения. Означает ли это, что сама операция плоской карты запланирована в потоке из пула потоков? Является ли это случаем, что каждая операция map или flatmap в Future выполняется в потоке из пула потоков? В этом случае, является ли запрос потока из пула потоков неизбежным, пока мы отображаем или отображаем Future, даже если он уже завершен из-за использования Future.successful и Future.failed?
Чтобы быть конкретными, давайте посмотрим на пример:
val fut = Future.successful(1+1).map(x => x+1)
Происходит ли операция сопоставления внутри потока, реквизированного из пула потоков, управляемого контекстом выполнения?
Это только для меня, чтобы лучше понять, почему использование Future.successful и Future.failed считается лучшим стилем, чем прямая упаковка некоторого кода с помощью Future (). Чтобы повторить то, что я сказал выше, я уже знаю, что выбрасывание исключений является узким местом производительности, но использует ли Future.successful и Future.failed избегание полного запроса потока из пула потоков и тем самым снижает нагрузку на производительность? Является ли это совершенно неактуальным, поскольку сопоставление или преобразование Future должно быть запланировано для потока из пула потоков в любом случае?