Wann reagieren Threads, die für Scala-Actors erstellt wurden?

8

Nachdem ich gelesen habe, dass react in Actors in Scala verwendet wird, dachte ich, dass react 's den gleichen Thread teilen würden, da nicht mehrere react ausstehen. Es scheint nicht der Fall zu sein.

%Vor%

Kann jemand erklären, warum diese react auf verschiedenen Threads laufen und wenn ein neuer Thread für einen Actor mit react erstellt wird?

Ich las irgendwo react ist ereignisbasiert, und ich nahm das so auf, dass "React Actors" einen Thread teilten und wenn jemand "reagierte", würden die anderen "React Actors" in die Warteschlange gestellt werden, bis der erste fertig war. Ich denke jetzt, dass ich falsch liege. Wie funktioniert das und wie ist es anders als zu empfangen?

    
agilefall 06.10.2009, 17:01
quelle

4 Antworten

9

Es stimmt, dass für einen reinen ereignisbasierten Akteur sein reagierender Code auf demselben Thread läuft wie der Code zum Senden von Nachrichten.

Aber in Scala ist es nicht wünschenswert, einen Thread zu blockieren, wenn ein Akteur innerhalb seines reaktiven Codes eine blockierende Operation aufruft und ereignisbasierte und threadbasierte Akteure vereinheitlicht (in der Lage ist, sie zu verfassen), beide Arten von Akteuren Derselbe Threadpool, aber die Thread-basierten Akteure erhalten ihre eigenen Threads, während ereignisbasierte Akteure Threads basierend auf einer Aufgabenwarteschlange teilen. Details finden Sie unter Akteure, die Threads und Events vereinheitlichen von Philipp Haller und Martin Odersky

    
Walter Chang 07.10.2009, 04:14
quelle
5

Nimm keinen separaten Thread pro Akteur an. Die Scala-Maschine erstellt einen Pool von Worker-Threads und vergrößert diesen Pool nur, wenn die Größe der blockierten Akteure größer ist als die Poolgröße. Wenn Ihr Akteur receive aufruft, befindet er sich in einem gesperrten Zustand, bis er seine Nachricht erhält.

    
andyczerwonka 08.10.2009 13:05
quelle
4

Um den in den vorherigen Antworten beschriebenen Effekt zu sehen, müssen Sie mehr als zwei Threads erzeugen. Dieses Beispielprogramm erzeugt 100 Threads mit receive und 100 Threads mit react.

Wenn Sie es ausführen, können Sie sehen, dass die Empfangs-Aktoren jeweils einen Thread belegen und die reaktiven Aktoren sich eine kleine Anzahl von Threads teilen. (Es ist am einfachsten zu sehen, wenn Sie die Ausgabe sortieren.)

%Vor%

Die sortierte Ausgabe in einem typischen Programmlauf:

%Vor%     
cayhorstmann 29.10.2011 14:36
quelle
3

Die Scheduler-Bibliothek verwendet einen Thread-Pool, um die Ausführung der Aktoren zu steuern. Ich kenne die Besonderheiten der Logik nicht, die es verwendet, aber für mich wäre es natürlich, dies zu erwarten:

  • Initialisieren Sie mit mehr als einem Thread im Pool, da Multithread-Anwendungen höchstwahrscheinlich mehr als einen Thread verwenden.

  • Wählen Sie den Thread aus, der mit einem wartenden Akteur in einer Warteschlangen-ähnlichen Weise verwendet werden soll - Threads werden bis zum Ende der Warteschlange freigegeben und vom Anfang der Warteschlange übernommen.

Ich nehme auch an, dass einige Threads verwendet werden, um die Planung selbst sowie die Weitergabe von Nachrichten zu behandeln.

    
Daniel C. Sobral 06.10.2009 17:54
quelle

Tags und Links