Ich lerne Akka Actor vor kurzem. Ich habe das Dokument der Dispatcher in Actor gelesen. Ich bin neugierig auf die blockierende Operation in einem Schauspieler. Die letzte topic in dem Dokument beschreibt, wie das Problem zu lösen ist. Und ich versuche, das Beispielexperiment in dem Dokument zu reproduzieren.Blocking-Operation in Actor NOT besetzt alle Standard-Dispatcher
Hier ist mein Code:
package dispatcher
import akka.actor.{ActorSystem, Props}
import com.typesafe.config.ConfigFactory
object Main extends App{
var config = ConfigFactory.parseString(
"""
|my-dispatcher{
|type = Dispatcher
|
|executor = "fork-join-executor"
|
|fork-join-executor{
|fixed-pool-size = 32
|}
|throughput = 1
|}
""".stripMargin)
// val system = ActorSystem("block", ConfigFactory.load("/Users/jiexray/IdeaProjects/ActorDemo/application.conf"))
val system = ActorSystem("block")
val actor1 = system.actorOf(Props(new BlockingFutureActor()))
val actor2 = system.actorOf(Props(new PrintActor()))
for(i <- 1 to 1000){
actor1 ! i
actor2 ! i
}
}
package dispatcher
import akka.actor.Actor
import scala.concurrent.{ExecutionContext, Future}
class BlockingFutureActor extends Actor{
override def receive: Receive = {
case i: Int =>
Thread.sleep(5000)
implicit val excutionContext: ExecutionContext = context.dispatcher
Future {
Thread.sleep(5000)
println(s"Blocking future finished ${i}")
}
}
}
package dispatcher
import akka.actor.Actor
class PrintActor extends Actor{
override def receive: Receive = {
case i: Int =>
println(s"PrintActor: ${i}")
}
}
ich einfach eine ActorSystem
mit den Standard-Disponenten erstellen und alle Akteure hängen von denen. Die BlockingFutureActor
hat eine Blockierung, die in einem Future
gekapselt ist. Die PrintActor
druckt nur eine Nummer sofort.
In der Erläuterung des Dokuments werden die Standard-Dispatcher von Future
s in BlockingFutureActor
besetzt, was zur Blockierung der Nachricht von führt. Die Anwendung bleibt irgendwo stecken wie:
> PrintActor: 44
> PrintActor: 45
Leider ist mein Code nicht blockiert. Alle Ausgaben von PrintActor
zeigen sich reibungslos. Aber Ausgaben von BlockingFutureActor
zeigen sich wie quetschen Zahnpasta. Ich versuche, meinen Thread info von IntelliJ der Debug-Monitor, ich habe:
Sie finden nur zwei Disponenten schlafen (BlockingFutureActor
macht dies geschehen). Andere warten, was bedeutet, dass sie für die Zustellung neuer Nachrichten verfügbar sind.
Ich habe eine Antwort über blockierende Operation in Actor (page) gelesen. Es wird zitiert, dass "Dispatcher effektiv thread-pools sind. Das Trennen der beiden garantiert, dass die langsamen, blockierenden Operationen die anderen nicht verhungern. Dieser Ansatz wird im Allgemeinen als Massen-Überschrift bezeichnet, weil die Idee ist, dass Wenn ein Teil der App fehlschlägt, bleibt der Rest reaktionsfähig. "
Behindern Standard-Dispatcher einige Dispatcher für blockierende Operationen? Dadurch kann das System Nachrichten verarbeiten, selbst wenn so viele blockierende Operationen nach Dispatcher fragen.
Kann das Experiment im Akka-Dokument reproduziert werden? Stimmt etwas nicht mit meiner Konfiguration?
Vielen Dank für Ihre Vorschläge. Die besten Wünsche.
Sagen Sie, dass Sie alle 1000 'println' Anweisungen von' PrintActor' sehen? – chunjef
Ja, genau. 1000 'println' erscheinen in dem Moment, in dem die Anwendung gestartet wird. – jiexray