我最近正在學習Akka Actor。我讀了演員中調度員的文件。我對演員中的阻止操作感到好奇。文檔中最後的topic描述瞭如何解決該問題。我試圖重現文檔中的示例實驗。演員中的阻止操作不佔用所有默認調度員
這裏是我的代碼:
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}")
}
}
我只是創建默認的調度員的ActorSystem
和所有演員取決於這些。 BlockingFutureActor
具有封裝操作,封裝在Future
中。 PrintActor
僅僅是打印一個數字。
在文檔的說明中,BlockingFutureActor
中的默認調度程序將被Future
s佔用,導致PrintActor
的消息阻塞。該應用程序卡住在某處:
> PrintActor: 44
> PrintActor: 45
不幸的是,我的代碼沒有被阻止。 PrintActor
的所有輸出顯示順利。但是BlockingFutureActor
的輸出顯示出像擠壓牙膏。我嘗試監視的IntelliJ的調試我的線程信息,我得到:
你會發現只有兩個調度員正在睡覺(BlockingFutureActor
使這種情況發生)。其他人正在等待,這意味着他們可用於新消息傳遞。
我已閱讀關於在演員中阻止操作的回答(page)。有人引用說,「調度員實際上是線程池,分離兩個保證,即緩慢的阻塞操作不會使另一個餓死,這種方法通常被稱爲批量標題,因爲它的思想是如果應用程序的一部分失敗,其餘部分保持響應。「
默認調度程序是否將一些調度程序用於阻塞操作?這樣即使有很多阻塞操作要求調度員,系統也可以處理消息。
可以複製Akka文件中的實驗嗎?我的配置有問題嗎?
感謝您的建議。最好的祝願。
「從'PrintActor'顯示一切順利產出。」你是說你從'PrintActor'看到所有1000條'println'語句嗎? – chunjef
是的,確切地說。當應用程序啓動時,1000'println'出現。 – jiexray