簡體   English   中英

演員“隊列”?

[英]An Actor “queue”?

在Java中,要編寫一個向服務器發出請求的庫,我通常會實現某種調度程序(與Twitter4J庫中的調度程序不同: http ://github.com/yusuke/twitter4j/blob/master/twitter4j -core / src / main / java / twitter4j / internal / async / DispatcherImpl.java )限制連接數,執行異步任務等。

這個想法是創建了N個線程。 “任務”排隊並通知所有線程,其中一個線程在准備就緒時,將從隊列中彈出一個項目,完成工作,然后返回等待狀態。 如果所有線程都忙於處理任務,那么Task就會排隊,下一個可用的線程將接受它。

這將最大連接數保持為N,並允許最多N個任務同時運行。

我想知道我可以用Actors創建什么樣的系統來完成同樣的事情? 有沒有辦法擁有N個Actors,當一條新消息准備就緒時,將它傳遞給一個Actor來處理它 - 如果所有Actors都忙,那么只需排隊消息?

Akka Framework旨在解決這類問題,正是您正在尋找的。

通過這個文檔來看 - 有很多高度可配置的調度程序(基於事件,基於線程,負載平衡,工作竊取等)管理actor郵箱,並允許它們一起工作。 你也可以在這篇博文中找到有趣的內容

例如,此代碼基於固定的線程池實例化新的工作竊取調度程序,它實現了它監督的參與者之間的負載平衡:

  val workStealingDispatcher = Dispatchers.newExecutorBasedEventDrivenWorkStealingDispatcher("pooled-dispatcher")
  workStealingDispatcher
  .withNewThreadPoolWithLinkedBlockingQueueWithUnboundedCapacity
  .setCorePoolSize(16)
  .buildThreadPool

使用調度程序的Actor:

class MyActor extends Actor {

    messageDispatcher = workStealingDispatcher

    def receive = {
      case _ =>
    }
  }

現在,如果您啟動了2個以上的actor實例,調度程序將平衡actor的郵箱(隊列)之間的負載(在郵箱中有太多郵件的actor將“捐贈”一些給沒有任何事情的actor) 。

好吧,你必須看看演員調度器,因為演員通常不會與線程一對一。 演員背后的想法是你可能有很多,但線程的實際數量將被限制在合理的范圍內。 它們也不應該長時間運行,而是快速回復它們收到的消息。 簡而言之,該代碼的架構似乎與設計演員系統的方式完全不一致。

盡管如此,每個工作的演員都可以向Queue actor發送消息,要求下一個任務,然后循環回來做出反應。 此隊列角色將接收排隊消息或出列消息。 它可以這樣設計:

val q: Queue[AnyRef] = new Queue[AnyRef]
loop {
  react {
    case Enqueue(d) => q enqueue d
    case Dequeue(a) if q.nonEmpty => a ! (q dequeue)
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM