web-dev-qa-db-fra.com

Cas d'utilisation de scala.concurrent.blocking

Je suis tombé sur le scala.concurrent.blocking, et selon la documentation Scala c'est ...

Utilisé pour désigner un morceau de code potentiellement bloquant, permettant au BlockContext actuel d'ajuster le comportement du runtime. Marquer correctement le code de blocage peut améliorer les performances ou éviter les blocages.

J'ai quelques doutes:

  • quel est le facteur avec lequel de nouveaux threads seront générés?
  • Est-ce applicable uniquement pour scala.concurrent.ExecutionContext.Implicits.global contexte d'exécution ou pour les contextes d'exécution créés par l'utilisateur?
  • Que se passe-t-il si j'encapsule un exécutable avec blocking { ... }?
  • Tout cas d'utilisation pratique où nous devrions utiliser cette construction.
69
Sourav Chandra
  1. Les nouveaux threads sont générés dans le pool de fork/join quand il détecte que tous les threads du pool de fork/join s'attendent les uns les autres à l'aide de la construction join, et il y a plus de travail à accomplir qui pourrait potentiellement terminer l'un des fils. Alternativement, si l'un des threads ForkJoinWorker exécute du code qui bloque autrement qu'en utilisant join, il peut notifier le pool en utilisant ManagedBlockers .
  2. Il est potentiellement applicable à tout type de contexte d'exécution - il sert de notification à l'implémentation ExecutionContext que le code exécuté par un thread de travail est potentiellement bloquant à certaines conditions, et que cette condition peut être résolue en calculant autre chose en utilisant un autre fil. Le contexte d'exécution peut ou non agir en conséquence. Dans l'implémentation actuelle (2.10, 2.11), blocking ne fonctionnera qu'avec le contexte d'exécution global par défaut.
  3. Si vous encapsulez un exécutable avec un blocage, vous induisez un peu de temps d'exécution, alors ne le faites pas toujours.
  4. Si vous avez un calcul qui dure longtemps, par exemple secondes ou minutes, ou vous attendez un futur pour terminer à l'aide de Await, ou vous attendez que l'état d'un moniteur soit résolu, et cette condition peut être résolue par une autre tâche/futur qui devrait s'exécuter sur le même contexte d'exécution - dans tous ces cas, vous devez utiliser blocking.

ÉDITER:

Pensez à jeter un œil au chapitre 4 dans le Apprentissage de la programmation simultanée dans Scala book .

57
axel22