Beantworten Sie Ihre Frage direkt; gibt es eine good article an diesem Thema:
Noch einmal, wenn Sie Berechnungen mit langer Laufzeit, mit ihnen in einem separaten ExecutionContext für CPU-gebundenen Aufgaben auszuführen sind eine gute Idee.
Der Artikel hat das folgende Beispiel:
import java.util.concurrent.Executors
import concurrent.ExecutionContext
//I added 'private' for the rest of the example
private val executorService = Executors.newFixedThreadPool(4)
private val executionContext = ExecutionContext.fromExecutorService(executorService)
Answering indirekt
Futures Erste
bin ich völlig einverstanden, dass Akka Schauspieler sind ein sehr nützliches Werkzeug für bestimmte Arten von Arbeit. Wenn es um Caching geht, sind Actors
& Agents
das beste Spiel in der Stadt.
In diesem Fall würde ich jedoch die Verwendung eines Future
anstelle eines Actor vorschlagen. Sie könnten sehr LongProcess eine private
Funktion machen. Die Privatsphäre würde vollständige Kontrolle über die Anzahl der Threads ermöglichen, die die Methode auf einmal aufrufen:
def longProcessFut(start : Int, noOfElements : Int) : Future[Result] = Future {
veryLongProcess(start, noOfElements)
}(executionContext)//controls the executing pool of veryLongProcess
Einfach, prägnant und asynchron.
Kein Töten von Briefen, keine überladene Methode, die alles unter der Sonne akzeptiert, noch Props, nicht einmal ein ActorRef war für die Zukunft notwendig. Aufgeblasen, Bierbauch sag ich!
Außerdem wird Ihre Benutzer gehen eine Zukunft, egal was wegen ?
erstellen: zur Verwendung von Futures direkt
//happy user code
val fut : Future[Result] = longProcessFut(0, 42)
gleicher großer Zukunft, aber die Hälfte der Kalorien
//Actor user code, too verbose
val longProcessRef = actorSystem actorOf Props[Worker]
val fut : Future[Result] = (longProcessRef ? Work(0,42)).mapTo[Result]
Im Vergleich!
Sie können den Dispatcher der Zukunft auf die gleiche Weise steuern, wie in den Kommentaren vorgeschlagen, die ziemlich gut sind. Sie können sogar actorSystem.dispatcher
als Ihren zukünftigen Dispatcher verwenden, um das Dispatcher-Verhalten zu steuern.
Sie können die Konfiguration Dispatcher, um das geeignete Thread-Modell für Ihre Anwendung zu sein. Wahrscheinlich möchten Sie einen separaten Thread-Pool für den Dispatcher einrichten, der langsame Aufgaben ausführt, und den Standard-Dispatcher für andere Akteure, die kurzlebige Aufgaben ausführen, belassen. http://doc.akka.io/docs/akka/snapshot/scala/dispatchers.html Es ist eine gute Idee, alle Dokumente zu lesen, wenn Sie zu einem so umfangreichen Framework kommen, um sich über alle konfigurierbaren Teile zu informieren. – simbo1905
Ok, das macht Sinn. Ich glaube, meine Sorge ist, dass Akka irgendeine Art von Zeitüberschreitung oder eine andere solche Eigenschaft hat, dass nach einer gewissen verstrichenen Zeit annehmen würde, dass der Schauspieler gestorben ist. –
Nach meiner Erfahrung tankt sich die Arbeit in den Postern des Schauspielers so lange auf, bis du keinen Haufen mehr hast. Ressourcenmanagement ist also etwas, was Sie sonst noch konfigurieren müssen. Einfache Dinge sind einfach, komplexe Dinge sind möglich. Mein oberster Tipp ist, mach nicht alles zu einem Schauspieler. Futures sind auch deine Freunde und verwenden nur Schauspieler, um Multitasking und Remoting zu erleichtern. – simbo1905