1

我有以下代码:

actor {
  loop {
     react {
       case SomeEvent =>
         //I want to submit a piece of work to a queue and then send a response 
         //when that is finished. However, I don't want *this* actor to block
         val params = "Some args"
         val f: Future[Any] = myQueue.submitWork( params );
         actor {
           //await here
           val response = f.get
           publisher ! response
         }

     }
  }
}

据我了解,外部参与者不会阻塞,f.get因为这实际上是由一个单独的参与者(在SomeEvent处理程序内部创建的参与者)执行的。

它是否正确?

4

1 回答 1

2

对,那是正确的。您的外部参与者将简单地创建一个参与者并暂停(等待其下一条消息)。但是,要非常小心这种事情。内部actor在调度程序上自动启动,由线程处理。该线程将阻塞该 Future (对我来说这看起来像 java.util.concurrent.Future)。如果你这样做的次数足够多,你可能会遇到所有可用线程都阻塞在 Futures 上的饥饿问题。Actor 基本上是一个工作队列,因此您应该使用这些语义。

这是您的代码的一个版本,使用Scalaz 演员库。这个库比标准的 Scala 演员更简单和更容易理解(源代码实际上是一页半)。它还导致了更简洁的代码:

actor {(e: SomeEvent) => promise { ... } to publisher }

这个版本是完全非阻塞的。

于 2009-06-05T07:02:33.233 回答