`
jilen
  • 浏览: 98145 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

scala actors example

 
阅读更多

学习Scala已经有不少时间了,对FP还是不甚了了。现在决定把自己的点滴的进步都记录下来。

 

今天看一个写信并等待回复的场景

Jilen写了一封信给Yision(是我的一个大学同学),现在Jilen把信投递到邮递员Jerry(另外一个大学同学),邮递员把信送给Yision

Yision收到后回复了一封信给Jilen,这封信同样给邮递员Jerry

 

现在看看我们的类型系统


类型系统分成两类对象,人和消息(信件和回复)

先来看看我们的消息系统

 

sealed trait Message {
  val from: Person
  val to: Person
  val content: String
}
case class Letter(val from: Person, val to: Person, val content: String) extends Message
case class Reply(val from: Person, val to: Person, val content: String) extends Message

 

 Letter是一封信,Reply是一封回信(这里继承体系也许不那么合理)

 

再来看看我们的邮递员

 

/**
 * 邮递员
 */
class Postmen(name: String) extends Person(name) {
  def act = {
    loop {
      reactWithin(1000) {
        case x: Message =>
          println("[postmen] a message from %s to %s".format(x.from.name, x.to.name))
          x.to ! x
        case TIMEOUT =>
          println("[postmen] have no message within 1000 ms, i am now going to have a rest")
          exit()
      }
    }
  }
  start()
}

 

 邮递员这里做两件事,

 

  1. 不停查看有没有收到消息,如果有就说有一封从谁写给谁的信需要投递
  2. 如果1000ms内没有任何信件,就下班了
Jerry是这里唯一的邮递员
object Jerry extends Postmen("jerry")
 
 

再看看Jilen(我)是怎么写信的,
Jilen是独一无二的,所以他是一个object
    
/* it is me
*/
object Jilen extends Person("jilen") {
  def act {
    loop {
      react {
        case (toWhom: Person, content: String) =>
          //把信件给邮递员
          Jerry ! Letter(this, toWhom, content)
          receive {
            case Reply(from, to, content) =>
              //收到回复了
              println("[Jilen] a reply from " + from.name + " received, writes \"" + content + "\"")
              exit()
          }
      }
    }
  }

  /**
   * 还不知到这是给谁的信
   */
  class NoReceiver(val content: String) {
    /**
     * 指定信给谁,然后投递给邮递员
     */
    def to(whom: Person) = Jilen ! (whom, content)
  }

  def write(content: String) = {
    new NoReceiver(content)
  }
  start()
}

Jilen有个write方法可以在信纸上写上要说的话,返回一个NoReceiver,可以理解成信封上还没写收信人

  /**
   * 还不知到这是给谁的信
   */
  class NoReceiver(val content: String) {
    /**
     * 指定信给谁,然后投递给邮递员
     */
    def to(whom: Person) = Jilen ! (whom, content)
  }

to 方法填好收信人并告诉自己把信投递出去, 投递之后Jilen开始一直等待回复(下面的receive)

 

 case (toWhom: Person, content: String) =>
          //把信件给邮递员
          Jerry ! Letter(this, toWhom, content)
          receive {
            case Reply(from, to, content) =>
              //收到回复了
              println("[Jilen] a reply from " + from.name + " received, writes \"" + content + "\"")
              exit()

 

Yision同样是一个object,他收到了Jilen的信并回复

 

object Yision extends Person("yision") {
  def act = {
    loop {
      react {
        //收到信并回复
        case Letter(from, to, content) =>
          println("[Yision] receive letter from %s, writes %s".format(from.name, to.name))
          Jerry ! Reply(this, from, "i have received a letter from you, and will reply to you soon")
          exit()
      }
    }
  }
  start()
}

 

等等!整个程序还差一个入口。

 

object App {
  def main(args: Array[String]) {
    Jilen write "hello" to Yision //
  }
}

 main方法只有一行,Jilen写了一封信给Yision,这就像一个导火线点燃了后面Jerry和Yision的所有动作。

 

  • 大小: 37.4 KB
1
1
分享到:
评论
2 楼 jilen 2015-08-06  
chenjingbo 写道
尼玛,看不懂啊大湿

年轻时候胡乱瞎写的
1 楼 chenjingbo 2015-07-20  
尼玛,看不懂啊大湿

相关推荐

    Scala By Examples

    "Scala By Example" 是一本专为学习Scala编程所编写的实践指南,旨在通过实例帮助初学者更好地理解和掌握这门语言。 在书的第一部分,"A First Example" 引导读者通过一个简单的程序了解Scala的基本结构。这个例子...

    Scala in Depth

    By presenting the emerging best practices and designs from the Scala community, it guides you through dozens of powerful techniques example by example.About the Book Scala is a powerful JVM language ...

    Scala 教程

    Scala提供了一种名为Actors的并发模型,它们是能够异步接收和处理消息的轻量级实体。Actors通过消息传递进行通信,从而避免了共享状态,减少了并发问题。 ```scala import scala.actor.Actor class SimpleActor ...

    play-scala-rest-api-example:显示REST API的示例Play Scala应用程序

    使用Scala与Play Framework结合,可以编写出简洁、类型安全的代码,同时利用Scala的高级特性如模式匹配和 Actors模型。 ### 示例应用概述 `play-scala-rest-api-example`是一个简单的应用,展示了如何在Play框架中...

    Learning Akka(PACKT,2015)

    Software today has to work with more data, ...The book is an easy to follow example-based guide that will strengthen your basic knowledge of Akka and aid you in applying the same to real-world scenarios.

    akka-cluster-example:Akka Cluster - 简单示例

    5. **Sharding**:为了管理大量 Actors,Akka 提供了分片(Sharding)功能,将 Actors 分散到不同的节点上,确保负载均衡。 6. **Singletons**:Akka Cluster 提供了 Singleton 模式,确保集群中只有一个特定 Actor...

    java-akka-workpulling-example:Java 中 Akka Actors 的工作拉模式示例

    该项目本质上是 Scala 示例的 Java 版本。 在此处阅读所有相关信息: : 。 所有学分归作者德里克怀亚特所有。 怎么跑 您可以像运行每个普通的 Java 主程序一样运行该程序。 在获取 Akka 依赖项之前,请确保您已mvn ...

    akka-cluster-router-example:akka-cluster-router-example

    3. **Receiver Actors**:集群路由器需要有接收者Actor来处理分发的任务。这些接收者可以在集群的任何节点上,只要它们注册为可用的接收者即可。接收者Actor通常定义了处理特定任务的行为。 4. **消息发送**:应用...

    akka-typed-example:以下博客文章中使用的Akka Typed快速示例

    1. **Actors**: Akka中的核心单元是Actor,它们是独立的执行线程,通过异步消息传递进行通信。Akka Typed进一步强化了这一概念,使得每个Actor都有一个明确的行为定义,即它能接收什么类型的message并如何响应。 2....

    akka-http-example

    Akka HTTP是一个强大的、高效的HTTP服务器和客户端库,由Lightbend公司开发,主要用于构建Scala和Java应用。本指南将深入探讨Akka HTTP的核心概念和实际应用场景,帮助开发者充分利用其功能来构建高性能的Web服务。 ...

    akka-typed

    Akka 是一个用 Scala 编写的开源库,用于构建高度并发、分布式和反应式的应用程序。它基于 Actor 模型,为 Java 和 Scala 提供了一个强大的工具集。在 Akka 中,"akka-typed" 是一个专门针对类型安全的 Actor API 的...

    akka in action.zip

    Summary Akka in Action is a comprehensive tutorial on building message-oriented systems using ...This book assumes that you're comfortable with Java and Scala. No prior experience with Akka required.

    actress-example:使用 Actress 的示例应用程序

    它借鉴了 Akka(一个用 Scala 编写的 Java 平台上的类似框架)的理念,将 Actor 模型引入到 JavaScript 世界,旨在解决多线程、并行处理和高可扩展性问题。在 Actress 示例应用程序中,我们可以深入学习 Actress ...

    play-ddp-example:探索在 Play 框架中实现 DDP 服务器

    Play框架是基于Scala和Java构建现代Web应用的热门选择,以其高效的开发效率和灵活的架构设计受到开发者喜爱。DDP(Distributed Data Protocol)是一种实时双向通信协议,常用于 Meteor JavaScript 开发框架,用于...

    java-akka-spring-example:三个角色和两个调度程序的可运行示例。 全部由Spring上下文管理

    Akka是一个用于构建高度并发、分布式和反应式应用程序的工具包,尤其适用于Java和Scala平台。Spring则是一个广泛使用的全面的企业级应用开发框架,提供了依赖注入、数据访问、事务管理等功能。 在这个项目中,重点...

    akka-cluster-singleton-example:Akka Cluster - 单例使用示例

    Akka 是一个用 Scala 编写的高性能、分布式计算框架,广泛应用于构建可扩展、容错的并发系统。在 Akka 中,"Cluster Singleton" 是一种设计模式,用于确保集群中的某个特定角色仅有一个实例存在。这个特性对于实现...

Global site tag (gtag.js) - Google Analytics