J'apprends Akka Acteur récemment. J'ai lu le document des répartiteurs dans Acteur. Je suis curieux au sujet de l'opération de blocage chez un acteur. Le dernier topic dans le document décrit comment résoudre le problème. Et j'essaie de reproduire l'exemple d'expérience dans le document.Opération de blocage dans l'acteur n'occupant pas tous les expéditeurs par défaut
Voici mon 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}")
}
}
Je crée simplement un ActorSystem
avec les répartiteurs par défaut et tous les acteurs dépends de ceux-ci. Le BlockingFutureActor
a une opération de blocage qui est encapsulée dans un Future
. Le PrintActor
imprime simplement un nombre instantanément.
Dans l'explication du document, les répartiteurs par défaut seront occupés par Future
s dans le BlockingFutureActor
, ce qui entraîne le blocage des messages du PrintActor
. L'application se coince quelque part comme:
> PrintActor: 44
> PrintActor: 45
Malheureusement, mon code n'est pas bloqué. Toutes les sorties de PrintActor
apparaissent doucement. Mais les sorties de BlockingFutureActor
apparaissent comme un dentifrice pressant. J'essaie de surveiller mes informations de fil en Debug Intellij, je suis arrivé:
Vous trouverez peut-être que deux répartiteurs dorment (BlockingFutureActor
fait cela arrive). D'autres attendent, ce qui signifie qu'ils sont disponibles pour la livraison de nouveaux messages.
J'ai lu une réponse à propos de l'opération de blocage dans Actor (page). Il est cité que «les répartiteurs sont, en fait, des pools de threads: en séparant les deux garanties, les opérations de blocage lent ne cèdent pas la place à l'autre: cette approche est généralement appelée« bulk-heading »car l'idée est que Si une partie de l'application échoue, le reste reste réactif. "
Est-ce que les répartiteurs par défaut épargnent certains répartiteurs pour les opérations de blocage? De telle sorte que le système peut gérer les messages même s'il y a tellement d'opérations de blocage demandant des répartiteurs.
L'expérience du document Akka peut-elle être reproduite? Y at-il un problème avec ma configuration?
Merci pour vos suggestions. Meilleurs vœux.
« Toutes les sorties de' PrintActor' apparaissent en douceur. » Êtes-vous en train de dire que vous voyez toutes les 1000 instructions 'println' de' PrintActor'? – chunjef
Oui, exactement. 1000 'println' apparaît au moment où l'application démarre. – jiexray