`
ai_longyu
  • 浏览: 480798 次
社区版块
存档分类
最新评论

Actors in Scala(Scala中的Actor)(预打印版) 第二章 Messages All the Way Up (A)

 
阅读更多

Actors in Scala(Scala中的Actor)(预打印版) 第二章Messages All the Way Up(A)

张贵宾

guibin.beijing@gmail.com

2011.10.08


第二章Messages All the Way Up(始终都是消息)

基于Actor的编程力争将无处不在的并发世界建模成为数不多的简单抽象。在一头栽入Scala的actor库之前,很有必要简单回顾一下最常用的Actor编程模型。Actor的库函数实现了这些特性,与此同时象许多Scala API一样,Actor的API也在不断的演进,并且将来的版本将会提供更多的能力。在即将介绍的Actor编程模型的概览中,我们都引用的是Scala actors已经实现的功能,并且当与通用的Actor相关时,我们会指出Scala actors和通用Actor模型的区别。


2.1 Control flow and data flow(控制流和数据流)

Actor编程模型的设计者是从为并发系统的控制流定义合适的抽象开始设计Actor的。非正式的讲,程序的控制流是指程序在执行下一步指令时的选择。分支,比如switch和case语句,也就是决定将从一个方法调用时返回什么结果,这些都是控制流。除了微不足道的程序之外,程序都包含控制流。


顺序程序(sequential programs)的开发者不会认为控制流是一个有问题的任务,毕竟我们平常没有太多的考虑这些基本程序结构的含义,便例行公事般的写if,whilefor表达式。然而并发会使得控制流更难推断。这是由于控制流经常会依赖一些逻辑、数据或者程序的内嵌状态。




在小程序中,数据和使用这些数据的控制结构相互间的距离很接近,甚至就在同一个对象中。当程序的体积增长时,控制流的决定需要去查询一些定义在程序其他部分的数据或者程序状态。比如,下面的表达式需要访问currentSpeeddesiredSpeed变量:



currentSpeeddesiredSpeed都定义在if else控制结构之外,也许甚至定义在包含这个控制表达式的方法或者对象之外。相似的,实现currentSpeeddesiredSpeed的方法可以访问这两个变量,而且定义在程序其他部分的程序也能访问、修改这两个状态。因此这样的程序需要访问其他对象暴露和共享的程序状态。在上面的这个例子中,比如SpeedMonitor对象可能有一个public的currentSpeed的访问方法,这个方法可以被程序中的其他对象调用。currentSpeed就变成了全局可见的程序状态。

对于不同对象可见的全局的程序状态,如果仅仅是单线程访问这个状态,那就没有什么问题。但是如果许多并行执行的线程需要访问全局可见的状态,此时开发者就需要非常小心的同步去访问(synchronize access)控制状态的那个对象。


正确的同步访问共享数据并不难,但是这样做会降低系统的并发处理能力。其原因如下,当并发程序运行时,从概念上讲有两种不同类型的变化发生:首先,当不同的线程都从程序的开始处执行,然后基于程序的控制流蜿蜒的从各种可能的路径执行下去。这些线程会依次修改那些掌控程序状态的变量。你可以认为这些状态的变化定义了程序的数据流。开发者必须非常小心的确认程序数据流中的每一处可以修改的地方接下来会不会影响其他正在执行的线程,并且要提防意外的副作用。


一个已经被证明的能确避免令人保讨厌的数据流和控制流冲突的有效方法是:使并发执行的线程顺序访问程序的数据流。使用诸如锁(lock)、监视器(monitor)和信号(semaphores)这些特殊的结构,开发者能够严格的指定影响数据流的线程的执行顺序。有关Semaphore的细节,请参考Semaphore的API


有了java.util.concurrent包之后,使用Java或者Scala定义这样的顺序访问方式就非常的简单了。


虽然顺序全局可见的程序状态能帮助我们定义正确的程序行为,但是他会削弱并发执行带来的一系列优势:比如在前面章节提到的,并发的优势在于对程序蜿蜒曲折的访问程序状态的顺序没有限制(然而使用Semophore这些特殊的结构之后,就变得有序但是低效了)。实际上,同步是把一部分程序变成了串行执行,这由于在同一时刻仅能有一个线程访问全局的或者共享的状态。确实,如果整个程序的控制结构都依赖于全局可见的状态,那除了串行访问之外,就基本没有办法避免不正确的行为了。


Actor模型的一个主要的贡献就是以最小程度依赖全局程序状态的方式定义了控制结构,即所有的需要控制流程决定的状态和相关知识都与最终做决定的对象在同一个对象中。这些对象依次控制数据流,或者基本基于本地可见的数据来控制数据流。这个(使得共享数据、状态与控制流程在一起的)地点规则使得程序中的控制流和数据流形影不离、不可分割,进而减少了同步的需求,这反过来使得潜在的并发(性能)最大化。


虽然基于Actor的系统认为全局(可见的)状态是恶魔(即全局状态是基于Actor系统所摒弃的),但是在实际中一些控制结构仍然需要访问全局可见的状态,最近新添加的Scala的Actors中的一些库函数使得在Actor的上下文中推理这样的共享状态变得更容易。在本书中我们将着重强调Scala的这些特性。




分享到:
评论

相关推荐

    actors in scala

    This bookis a tutorial for programming with actors in the Scalaprogram-minglanguage. Actors providea high-levelprogramming model for con-current and distributed systems based onlightweight processes ...

    scala-actors-2.10 jar包

    scala-actors-2.10 jar包,可以解决 scala-actors-2.10以上版本带来的不兼容问题

    Actors in Scala 无水印转化版pdf

    Actors in Scala 英文无水印转化版pdf pdf所有页面使用FoxitReader、PDF-XChangeViewer、SumatraPDF和Firefox测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 查看此书详细信息请在美国...

    Artima.Actors.in.Scala.Mar.2011

    The book provides a comprehensive introduction to the actor model of concurrency and shows how Scala's actors enable you to build efficient, scalable, and robust concurrent software for the JVM.

    Actors in Scala

    英文版书籍,谨慎下载。 Actors 是并发程序的一个数据结构模型。基于Scala强大DSL功能,你可以利用Actor模型快速开发健壮高效的高性能并发计算程序。

    Scala.Functional.Programming.Patterns.178398

    If you have done Java programming before and have a basic knowledge of Scala and its syntax, then this book is an ideal choice to help you to understand the context, the traditional design pattern ...

    kafka-on-actors:用于 Scala 的基于 Akka Actors 的 Kafka 消费者生产者

    Scala 的基于 Akka Actors 的 Kafka 消费者/生产者 支持卡夫卡 0.8.2.1 概念 Kafka 的消费者本质上是阻塞的,其想法是让消费者在自己的线程池中运行,并将消息委托给在自己的线程池中运行的 worker-actor,同时实现...

    akka in action

    Akka is a Scala-based toolkit that simplifies developing concurrent distributed applications. Akka uses Actors-independently executing processes that communicate via message passing—as the foundation...

    Effective Akka

    The book also includes examples of actor application types and two primary patterns of actor usage, the Extra Pattern and Cameo Pattern., Allen, the Director of Consulting for Typesafe—creator of ...

    akka in action.zip

    You'll start with the big picture of how Akka works, and then quickly build and deploy a fully functional REST service out of actors. You'll explore test-driven development and deploying and scaling ...

    Effective+Akka (1).zip

    the Director of Consulting for Typesafe—creator of Akka and the Scala programming language—examines actors with a banking-service use case throughout the book, using examples shown in Akka and Scala...

    hyrax:Scala 版本的 Hystrix 使用 Spray、akka actor 和 io

    ##概述#####Hyrax 是Scala 版本,使用 scala Futures/Promises 和 Akka Actors/ActorSystems 作为依赖弹性层。 它使用 Akka IO 来实现远程依赖。 它最初只支持 Web 服务,并使用 Spray 来处理 HTTP 请求/响应。 ...

    ray_actors_cross_language_communication:用于测试Java actor与Python actor之间的通信可能性的实验回购

    鉴于此,应该有可能将actor句柄传递给远程跨语言任务/ actor,以在远程代码中本地使用actor句柄。 main.py代码执行以下操作: 在工作进程中实例化RayEcho actor。 在工作进程中实例化一些EchoClient Java actor...

    akka-irc:Scala 和 Akka 中类似 IRC 的简单客户端和服务器实现

    Scala 和 Akka 中类似 IRC 的简单客户端和服务器实现。 感谢 LSUG 的人为使它更像 Scala 所做的贡献。 怎么跑 这个程序需要安装 Simple Build Tool ,它要求你至少有 java 1.6。 build.sbt 文件包含所有需求定义和...

    akkajava.pdf

    We believe that writing correct ...Please note that all code samples compile, so if you want direct access to the sources, have a look over at the Akka Docs subproject on github: for Java and Scala.

    Akka基本知识:本书中的JavaScala示例-Akka Essentials

    您将在Java和Scala中找到Akka的示例,同时讨论一个概念以及一个已解决的问题 ClientServerExample:此示例演示了远程参与者在客户端/服务器模式下的工作方式。 客户端将消息发送到服务器,服务器回复给客户端。 该...

    akka-actors-examples:用Akka谈Actor基础的小样例程序

    这是一个关于如何在 Scala 2.10 和 Akka 2.2 中使用 Akka actor 的小例子集合

    play-meetings:使用Scala Actors和WebRTC构建的Web会议示例

    玩会议这是带有Scala |的Play Framework应用程序。 Akka | WebSockets。 如今,所有网络会议网络软件都使用Adobe Flash或桌面应用程序(Adobe Connect,Gometeeting)构建。 这是尝试检查js功能以实现相同功能的尝试...

    actors:(WIP) 适用于 Android 的最小演员库

    事件在 actor 中按顺序处理,因此不需要同步。 但是,由于 actor 是模块化的并且不共享任何状态,因此它们可以以多线程方式处理其事件,而不会增加任何额外的复杂性。 是一个很棒的库,用于与 actor 进行并发编程...

Global site tag (gtag.js) - Google Analytics