scala - 可以使用 actor 'threadless' 在 Scala 中制作生产者/消费者对象(没有接收...)?

标签 scala actor

所以我想编写一些看起来阻塞的网络代码,而不是真正阻塞线程。我将通过网络发送一些数据,并有一个将通过网络返回的响应“队列”。我写了一个非常简单的概念证明,灵感来自这里的 actor 教程中的生产者/消费者示例:http://www.scala-lang.org/node/242

问题是,使用 receive 似乎占用了一个线程,所以我想知道是否有办法不占用一个线程但仍然有“阻塞感”。这是我的代码示例:

import scala.actors.Actor._;
import scala.actors.Actor;

case class Request(val s:String);

case class Message(val s:String);

class Connection  {
  private val act:Actor = actor {
     loop {
      react {
        case m:Message =>  receive { case r:Request => reply { m } }
      } 
    }
}

  def getNextResponse(): Message = {
    return (act !? new Request("get")).asInstanceOf[Message];
  }

  //this would call the network layer and send something over the wire
  def doSomething() {
    generateResponse();
  }

  //this is simulating the network layer getting some data back 
  //and sending it to the appropriate Connection object
  private def generateResponse() {
   act ! new Message("someData");
   act ! new Message("moreData");    
   act ! new Message("even more data");
  }

}


object runner extends Application {
 val conn = new Connection(); 
    conn.doSomething();
    println( conn.getNextResponse());
    println(conn.getNextResponse());
    println(conn.getNextResponse());
}

有没有办法在不使用接收的情况下做到这一点,从而使其成为无线程的?

最佳答案

您可以直接依赖 react 来阻止释放线程:

class Connection  {
  private val act:Actor = actor {
    loop {
      react {
        case r:Request => reply { r }
      } 
    }
  }
[...]

关于scala - 可以使用 actor 'threadless' 在 Scala 中制作生产者/消费者对象(没有接收...)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1879863/

相关文章:

javascript - JavaScript 中匿名函数的占位符

scala - Actors模型(Scala,Erlang)最适合​​哪种应用程序/服务/组件?

c++ - Actor 模型 : Why is Erlang/OTP special? 你能用另一种语言吗?

clojure - Clojure 中的 Actor

scala - 如何将 Column.isin 与列表一起使用?

Scalaz: `scalaz.syntax.applicative._` 如何发挥它的魔力

Scala - future 不运行

kubernetes - 将服务结构参与者转换为 kubernetes

java - 何时使用参与者而不是消息传递解决方案,例如 WebSphere MQ 或 Tibco Rendezvous?

eclipse - 如果我只想要顶级文件夹中的所有内容,有什么方法可以不混淆 sbt-eclipse? (2.2.0 与 0.12.4)