【问题标题】:Akka control threadpool threadsAkka 控制线程池线程
【发布时间】:2011-10-14 20:54:53
【问题描述】:

可能是一个非常愚蠢的问题--

是否可以自定义 Akka/Scala 角色以控制角色使用的线程?例如您可以初始化自己的一组线程以在线程池中使用,或者以其他方式控制/修改线程吗?

【问题讨论】:

    标签: scala actor akka


    【解决方案1】:

    我自己试着去理解它,但是 Akka 的人不希望线程管理暴露给公众。

    ThreadPoolConfig - 负责创建 ExecutorService 实例的类是一个 case 类,其方法 createExecutorService() 声明为 final! p>

      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 的简单方法。

    【讨论】:

    • 这是不正确的,您可以编写自己的 MessageDispatcher(扩展特征)实现并将其传递给 Actors,如范例的答案中所示。在 MessageDispatcher 实现中,您可以选择使用任何您想要的 executorservice。您提到的方法仅从 ExecutorBasedEventDrivenDispatcher 中使用。
    • 如果 MessageDispatcher trait 有这样的东西,我该怎么做 private[akka] def dispatch(invocation: MessageInvocation): Unit
    • @Raymond Roestenburg private[akka] def start(): Unit 据我了解,这是包私有方法,不能在 akka 外部访问。
    【解决方案2】:

    在 Akka 中,线程池是通过 MessageDispatcher 实例管理的。您可以轻松地为参与者设置您想要的调度程序:

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

    要提供您自己的调度程序,您可以扩展akka.dispatch.MessageDispatcher(有关示例,请参见现有的调度程序实现)。在这里你可以直接玩线程。

    当然,将业务逻辑放在调度程序中是很危险的,因为它可能会破坏参与者模型并增加并发错误的数量......

    【讨论】:

      猜你喜欢
      • 2014-08-01
      • 1970-01-01
      • 2018-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-18
      • 2018-10-02
      • 1970-01-01
      相关资源
      最近更新 更多