wake-up-neo.com

Verwenden Sie den Fall von scala.concurrent.blocking

Ich bin auf die scala.concurrent.blocking Methode und laut Scala Dokumentation ist dies ...

Wird verwendet, um einen Code zu kennzeichnen, der möglicherweise blockiert, sodass der aktuelle BlockContext das Verhalten der Laufzeit anpassen kann. Das korrekte Markieren des Blockierungscodes kann die Leistung verbessern oder Deadlocks vermeiden.

Ich habe Zweifel:

  • was ist der Faktor, mit dem neue Threads erzeugt werden?
  • Gilt das nur für scala.concurrent.ExecutionContext.Implicits.global Ausführungskontext oder auch für vom Benutzer erstellte Ausführungskontexte?
  • Was passiert, wenn ich eine ausführbare Datei mit blocking { ... }?
  • Jeder praktische Anwendungsfall, in dem wir dieses Konstrukt verwenden sollten.
69
Sourav Chandra
  1. Die neuen Threads werden im Fork/Join-Pool erzeugt, wenn mithilfe des Konstrukts join festgestellt wird, dass alle Threads im Fork/Join-Pool aufeinander warten, und möglicherweise sind weitere Arbeiten zu erledigen Beende einen der Fäden. Wenn einer der ForkJoinWorker Threads anderen Code ausführt als join, kann er den Pool mit ManagedBlockers benachrichtigen.
  2. Es ist potenziell auf alle Arten von Ausführungskontexten anwendbar - es dient als Benachrichtigung für die Implementierung von ExecutionContext, dass der von einem Arbeitsthread ausgeführte Code unter bestimmten Bedingungen möglicherweise blockiert und dass diese Bedingung möglicherweise durch Berechnen gelöst wird etwas anderes mit einem anderen Thread. Der Ausführungskontext kann darauf einwirken oder nicht. In der aktuellen (2.10, 2.11) Implementierung funktioniert blocking nur mit dem globalen Standardausführungskontext.
  3. Wenn Sie eine ausführbare Datei mit dem Blockieren einschließen, entsteht ein gewisser Zeitaufwand für die Laufzeit. Tun Sie dies also nicht immer.
  4. Wenn Sie eine Berechnung haben, die lange Zeit dauert, z. Sekunden oder Minuten, oder Sie warten darauf, dass eine Zukunft mit Await abgeschlossen wird, oder Sie warten darauf, dass der Zustand eines Monitors behoben wird, und dieser Zustand kann durch eine andere Aufgabe/Zukunft behoben werden, die auf dem ausgeführt werden soll Gleicher Ausführungskontext - in all diesen Fällen sollten Sie blocking verwenden.

BEARBEITEN:

Betrachten Sie Kapitel 4 im Buch Learning Concurrent Programming in Scala .

57
axel22