首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Akka 指南 之「Akka 和 Java 内存模型」

如果 Actor 在处理消息时更改其内部状态,并在稍后处理另一条消息时访问该状态。重要的是要认识到,对于 Actor 模型,你不能保证同一线程将对不同的消息执行相同的 Actor。...注释:在外行术语中,这意味着当 Actor 处理下一条消息时,Actor 内部字段的更改是可见的。因此,Actor 中的字段不必是volatile或equivalent的。...Futures 和 Java 存储模型 Future的“先于发生”调用任何注册到它的回调被执行之前。...我们强烈建议远离使用锁定的对象,因为它可能会导致性能问题,在最坏的情况下还会导致死锁。这就是同步的危险。 Actors 和共享可变状态 由于 Akka 在 JVM 上运行,所以仍然需要遵循一些规则。...import scala.concurrent.Future import scala.concurrent.duration._ import scala.language.postfixOps import

1K20

深圳scala-meetup-20180902(1)- Monadic 编程风格

刚完成了9月份深圳scala-meetup,趁刮台风有空,把我在meetup里的分享在这里发表一下。...Monad来编程,它的形式是:F[G],F是个Monad,然后G是具体的运算,G就是我们习惯的运算表达式如1+1、update('a','new content')等等,可能会产生副作用的,比如输入输出,更改数据等...形象点描述:如果我们把F[_]当作是一个管道,那么Monadic编程模式就像是在F这个管道里组装连接一些可能产生副作用的运算表达式。实际上真正产生运算结果的是管道内部的这些运算表达式。这是疯了吗?...值得注意的是:Monadic操作与scala里集合的操作很相似,不同的是Monadic操作类型只包含一个内部元素,而集合包含了多个元素,如List(1,2,3)有3个元素。...scala库里现成的Monad中Option,Either都有特别的作用:Option可以在遇到None值时中断运算并立即返回None值。

53730
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Akka(1):Actor - 靠消息驱动的运算器

    这段代码中QueryActor没有任何内部状态。通过Future传递计算结果能实现不阻塞(non-blocking)运算。...从这个案例中我的结论是尽量把Akka Actor使用在需要维护内部状态的应用中。如果为了实现non-blocking只需要把程序分布到不同的线程里运行的话就应该直接用Future,这样自然的多。...但使用Future是完全无法维护内部状态的。...4、State:Actor内部状态,由一组变量值表示。当前内部状态即行为函数最后一次运算所产生的变量值 下面我们就用个例子来示范Actor:模拟一个吝啬人的钱包,他总是会把付出放在最次要的位置。...code 0 下面是本次示范的完整代码: application.conf: prio-dispatcher { mailbox-type = "PriorityMailbox" } Actor101.scala

    64560

    Play For Scala 开发指南 - 第3章 常用类介绍

    3.1 String 在Scala中,String更加方便好用: //原始字符串一对三引号"""括起来,可包含多行字符串,内容不需要转义 """Welcome here....= 'a') // "bcd" //字符串插值, 以s开头的字符串内部可以直接插入变量,方便字符串构造 val i = 100 s"i=${i}" // "i=100" Scala中没有受检异常(checked...在Scala中默认的集合类例如List,Set,Map,Tuple等都是不可变的,所以调用其修改方法会返回一个新的实例。...你可以在Future上注册一个回调函数,以便在任务执行完成后得到通知: import scala.concurrent.ExecutionContext.Implicits.global val f =...第1行import语句导入了一个隐式的ExecutionContext,你可以把它理解成是一个线程池,Future类在需要时会自动使用其上的线程。在Scala中你不需要直接和线程打交道。

    84650

    为Play初学者准备的Scala基础知识

    = 'a') // "bcd" //字符串插值, 以s开头的字符串内部可以直接插入变量,方便字符串构造 val i = 100 s"i=${i}" // "i=100" Scala中没有受检异常(checked...在Scala中默认的集合类例如List,Set,Map,Tuple等都是不可变的,所以调用其修改方法会返回一个新的实例。...你可以在Future上注册一个回调函数,以便在任务执行完成后得到通知: import scala.concurrent.ExecutionContext.Implicits.global val f =...第1行import语句导入了一个隐式的ExecutionContext,你可以把它理解成是一个线程池,Future类在需要时会自动使用其上的线程。在Scala中你不需要直接和线程打交道。...由于Scala赋予程序员对代码很高的控制力,如果滥用就会导致天书般的代码,这需要团队内部进行协调,控制代码的复杂度。

    1.8K60

    Scala Actors迁移指南

    为了进一步的使迁移步骤更容易,我们将首先更改Actor类型系统中的每一个actor。这种迁移步骤很简单,因为Actor类位于层次结构的底部,并提供了广泛的功能。...actors创建并开始在迁移的系统的情况下,actors在不同的位置以及改变这可能会影响系统的行为,用户需要更改代码,以使得actors在实例化后立即开始执行。...(msg: Any): Future[Any] 被?替换。这条规则会改变一个返回类型到scala.concurrent.Future这可能导致类型不匹配。...由于scala.concurrent.Future比过去的返回值具有更广泛的功能,这种类型的错误可以很容易地固定在与本地修改: !!...处理程序可以提取作为一个单独的函数,并用来生成一个future对象结果。处理的结果应给出另一个future对象结果,就像在下面的例子: !? (msg: Any):任何被?

    1K20

    Scala的安装,入门,学习,基础

    在"变量值"一栏的最前面添加如下的路径:%SCALA_HOME%\bin; ? 以上的为必须配置的,下面的我之前都配置了,这里贴一下。方便脑补。...设置 Classpath 变量:找到找到系统变量下的"Classpath"如图,单击编辑,如没有,则单击"新建": "变量名":CLASSPATH "变量值":....;%SCALA_HOME%\bin;%SCALA_HOME%\lib\dt.jar;%SCALA_HOME%\lib\tools.jar.; 注意:"变量值"最前面的 .; 不要漏掉。...单击 【开始】,在输入框中输入cmd,然后"回车",输入 scala,然后回车,如环境变量设置ok,你应该能看到这些信息。...Ctrl+Alt+O 优化导入的类和包 10 Alt+Insert 生成代码(如get,set方法,构造函数等) mac系统 fn+alt+回车 11 Ctrl+E或者Alt+Shift+C 最近更改的代码

    1.1K90

    Spark入门,概述,部署,以及学习(Spark是一种快速、通用、可扩展的大数据分析引擎)

    Spark基于内存计算,提高了在大数据环境下数据处理的实时性,同时保证了高容错性和高可伸缩性,允许用户将Spark部署在大量廉价硬件之上,形成集群。...这些不同类型的处理都可以在同一个应用中无缝使用。Spark统一的解决方案非常具有吸引力,毕竟任何公司都想用统一的平台去处理遇到的问题,减少开发和维护的人力成本和部署平台的物力成本。...此外,Spark还提供了在EC2上部署Standalone的Spark集群的工具。 3:Spark的部署安装(上传jar,过程省略,记得安装好jdk。)...节点上修改slaves配置文件内容指定worker节点 7 2.在node1上执行sbin/start-all.sh脚本,然后在node2上执行sbin/start-master.sh启动第二个Master...5:Task在Executor上运行,运行完毕后释放所有资源。 待续......

    2.1K41

    使用 Future 进行并发编程

    Future 作为一个代理对象代表一个可能完成也可能未完成的值 1,通过对 future 进行操作,能够获取内部的计算是否已经完成,是否出现异常,计算结果是什么等信息。...对 Java Future API 的改进 要改善 Java 的 Future API,首先要提供接口让用户从阻塞调用变为非阻塞调用,也就是使用回调函数(使用 Scala 表示): trait Future...虽然 Scala 的这一套 API 很优雅,但是受限于 Java 的语法,这个设计在 Java 上却无法直接照搬,例如上面那段代码中的 for-comprehension 部分将被翻译成: val displayTextFuture...的这个实现没有 Scala 版本的代码优雅,但是在大多数情况下也够用,尤其是在受到 Java 的语法局限的情况下,这个已经是一个比较好的处理了。...总之,在 Java 8 之后,应该使用新的 API 来操作 future,以便能更加简便地处理并发和异步代码。

    99820

    Akka-Cluster(3)- ClusterClient, 集群客户端

    这是在同一个集群内的消息共享机制:发布者(publisher)和订阅者(subscriber)都在同一个集群的节点上,所有节点上的DistributedPubSubMediator通过集群内部的沟通机制在底层构建了消息流通渠道...在actor pub/sub层面可以实现对象位置透明化。...在现实里很多前端都会作为某个集群的客户端但又与集群分离,又或者两个独立的集群之间可能会发生交互关系,这是也会出现客户端与服务端不在同一集群内的情况,ClusterClient就是为集群外部actor与集群内部...ClusterClient在启动时用预先配置的地址(contact points)与ClusterClientReceptionist连接,然后通过ClusterClientReceptionist发布的联络点清单来维护内部的对接点清单...scala.io.StdIn.readLine() clientSystem.terminate(); } 客户端的ActorSystem名称为ClientSystem,是在ClusterSystem

    1.9K20

    Play For Scala 开发指南 - 第10章 MongoDB 开发

    目前有如下三个基于 Scala 开发的 MongoDB 驱动可供选择: Mongo Scala Driver ReactiveMongo Play Mongo Mongo Scala...Driver 是 MongoDB 官方维护的 Scala 驱动,该驱动底层基于官方的 Java 驱动,在此基础上提供了一层很薄的 Scala 包装。...另外 Mongo Scala Driver 的数据库操作默认返回 Observable 类型,如果你忘记了调用 toFuture 方法,或是没有消费返回数据,则数据库操作实际上并不会被执行,在开发中很容易引入一些...需要注意的是,在该方式下无法改变返回的结果类型。...mongo.collection("common-user").find[User]().list().map{ users => } 在这里, find 方法上的参数类型 User 仅仅用于指定返回的结果类型, 我们可以通过更改该参数类型设置不同的返回结果类型

    1.5K10

    Scala 强大的精简语法(示例)

    例如:java 里接口与继承,在 Scala 里的是特质(trait),弥补 java 中接口的尴尬之处,特质里的方法可实现也可不实现。...例如:implict 实现的隐式转换,替换原有函数功能,如+,-等操作符(+,-等操作符在 Scala 都是函数,当然自己就可以改变这些函数并运用下去)。...同时还有在并发编程方面也有不错的竞争手段,Scala 将并发结果变得更加可控,同时模式匹配、提取器这些数据集操作都给操作带来了很大的方便,笔者是 Scala 新手,这只是一些粗糙的理解(如发现错误欢迎留言...本文使用了 Scala future、promise、数据集、implict、jsoup 的一些相关操作,从而特意选做了一个功能主题:提取淘宝目录分类名,流程为:获取 tb 目录 id->取得 id 下所有的子分类...{Await, Future} import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.duration.Duration

    1.9K00
    领券