2011-07-28 41 views
1

潛在一件很無聊的question--阿卡控制線程池線程

是否可以定製阿卡/ Scala的演員,你控制由演員使用的線程?例如你能初始化你自己的一組線程,以便在線程池中使用,或者控制/修改線程嗎?

回答

4

在Akka中,線程池通過MessageDispatcher實例進行管理。您可以輕鬆地所需的調度程序設置爲演員:

class MyActor(dispatcher: MessageDispatcher) extends Actor { 
    self.dispatcher = dispatcher 
    ... 
} 

要提供自己的調度員,可以延長akka.dispatch.MessageDispatcher(參見例如現有的調度實施)。在這裏你可以直接玩線程。

當然,這是危險的把業務邏輯的調度中,因爲它可能會破壞演員模型,提高併發錯誤的數量...

-1

我試圖理解它自己,但那個接縫傢伙在阿卡不希望線程管理暴露給公衆。

ThreadPoolConfig - 這是負責創造的ExecutorService實例的類是與方法createExecutorService()的情況下,類中聲明最終

final def createExecutorService(threadFactory: ThreadFactory): ExecutorService = { 
    flowHandler match { 
     case Left(rejectHandler) ⇒ 
     val service = new ThreadPoolExecutor(...) 
     service 
     case Right(bounds) ⇒ 
     val service = new ThreadPoolExecutor(...) 
     new BoundedExecutorDecorator(service, bounds) 
    } 
    } 

所以,我沒有看到一個簡單的方法來提供自己的ExecutorService。

+0

這是不正確的,您可以編寫自己的MessageDispatcher(擴展特質)實現並將其傳遞給Actors,如範例中的答案。在MessageDispatcher實現中,您可以選擇使用任何您希望的執行者服務。您提到的方法只能從ExecutorBasedEventDrivenDispatcher中使用。 –

+0

我如何做到這一點,如果MessageDispatcher trait有這樣的事情 ** private [akka] def dispatch(invocation:MessageInvocation):Unit ** – Alex

+0

@Raymond Roestenburg ** private [akka] def start():Unit * * 據我所知這是封裝私有方法,cannod可以訪問外阿卡。 – Alex