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:
scala.concurrent.ExecutionContext.Implicits.global
Ausführungskontext oder auch für vom Benutzer erstellte Ausführungskontexte?blocking {
... }
?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 ManagedBlocker
s benachrichtigen.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.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 .