Подтвердить что ты не робот

Использовать случай scala.concurrent.blocking

Я столкнулся с методом scala.concurrent.blocking, и согласно документации Scala это...

Используется для обозначения фрагмента кода, который потенциально блокирует, что позволяет текущий BlockContext для настройки поведения во время выполнения. Должным образом код блокировки маркировки может повысить производительность или избежать взаимоблокировок.

У меня есть некоторые сомнения:

  • Каков фактор, с помощью которого появятся новые потоки?
  • Это применимо только для контекста выполнения scala.concurrent.ExecutionContext.Implicits.global или для пользовательских контекстов выполнения?
  • Что произойдет, если я завершу любой исполняемый файл с помощью blocking {... }?
  • Любой практический случай, когда мы должны использовать эту конструкцию.
4b9b3361

Ответ 1

  • Новые потоки появляются в пуле fork/join, когда он обнаруживает что все потоки в пуле fork/join ждут друг друга используя конструкцию join, и еще предстоит выполнить большую работу который мог бы закончить один из потоков. В качестве альтернативы, если один из потоков ForkJoinWorker выполняет код, который блокирует, кроме как с помощью join, он может уведомить пул, используя ManagedBlocker s.
  • Он потенциально применим к любым контекстам выполнения - он служит уведомлением о реализации ExecutionContext, что код, выполняемый рабочим потоком, потенциально блокирует какое-либо условие и что это условие может быть разрешено путем вычисления что-то другое, используя какой-то другой поток. Контекст выполнения может или не может действовать по этому поводу. В текущей (2.10, 2.11) реализации blocking будет работать только с глобальным контекстом выполнения по умолчанию.
  • Если вы завершаете какой-либо исполняемый файл с блокировкой, вы будете накладывать немного времени на выполнение, поэтому не всегда это делаете.
  • Если у вас есть расчет, который длится долгое время, например, секунд или минут, или вы ожидаете, когда вы закончите использование Await, или вы ожидаете, что состояние монитора будет разрешено, и это условие может быть разрешено другой задачей/будущим, которое должно выполняться в одном и том же контексте выполнения - во всех этих случаях вы должны использовать blocking.

EDIT:

Посмотрите на главу 4 в Обучающее параллельное программирование в книге Scala.

Ответ 2

Я всегда находил официальную документацию немного плохой в отношении блокирующей конструкции; поэтому я попытался объяснить это более четко в этом сообщении в блоге с примерами того, как вы могли бы реализовать свои собственные и как это работает под капотом.