最近研究了一些scala并发的知识,总结一下。 一.简介 即时响应性是一项决定任何应用程序成败的关键因素。有两种方式来提高即时响应性:1.多线程,并行运行多个任务。...3.无限流转换有限流 有限序列 无限流-》Stream 三.并行集合 顺序集合 顺序集合上的方法行为:它们为它们的集合中的每个元素顺序地执行它们的操作。 并行集合 ,Scala 都拥有其并行版本。...我们可以使用par()和seq()方法来在顺序集合及其并行版本之间进行相互转换。...Actor模型具有与生俱来的线程安全性。 多个Actor并发地运行,同时处理多条消息。 Actor是异步。 不会阻塞调用者。 不用显示创建一个线程池,显示调度任务。...线程并不和Actor绑定--一个线程池服务于多个Actor。 java创建共享可变变量,并使用同步原语来提供线程安全性。使用JDK 库很难在短时间内做到正确的并发。
Akka是什么 Akka是一款高性能高容错性的分布式&并行应用框架,遵循Apache 2开源许可,底层通过JVM上另外一个流行的语言Scala实现,提供Java&ScalaAPI(本书采用Java进行代码演示...Akka架构体系 Akka采用Scala开发,运行于JVM之上,提供了Scala和Java两种API,目前所属Lightbend公司(原名Typesafe)。...Actor模型 Actor模型最早在1973年由Carl Hewitt提出,它高度抽象了分布式并行程序的运行模式,从底层屏蔽了线程和锁机制的管理,为开发者提供了简单可依赖的开发方式。...在底层实现上,Actor是运行于线程池之上的,肯定会存在多个Actor共享同一个线程的情况,那么会不会出现并发问题呢?...实际上,Akka为每个Actor都抽象出一个轻量级的执行“线程”(不是真的线程),在底层已经实现了隔离性,所以基本上不用担心该问题的出现。
Sample Flowchart Template (2).png 这种方案是采用MQ作为中间的媒介,在服务端采用线程池异步处理任务,处理完成之后将结果发送到MQ中,客户端采用侦听的方式得到结果继续进行处理...这种方案的不足是,可能在某些需求的情况下,需要将结果存放到共享的HashMap或者Threadlocal中进行存放结果,客户端会一直阻塞,直到得到结果,从多线程的角度来说,还是用了共享变量,虽然共享变量可能是线程安全的...方案二 采用比较流行的Akka框架来实现。 **Akka的五大特性 ** 易于构建并行和分布式应用 可靠性(Resilient by Design) 系统具备自愈能力,在本地/远程都有监护。...因为之前一直研究Scala,Scala的多线程处理的性能是非常高的,那基于Scala语言而开发出来的Akka框架得到了广泛使用。...代码如下: import akka.actor.ActorRef; import akka.actor.ActorSystem; import akka.actor.Props; import akka.actor.UntypedActor
Spark netty RPC 通信原理 通信是分布式程序的血液和神经,就好比大脑发出的执行需要通过神经和需要才能传递到手脚进行执行。可见好的通信能力是分布式系统的重重之中。...(Akka是一个基于scala语言的比较先进异步通信的消息框架)但由于Akka不适合大文件的传输,其大文件是基于Jetty实现的HttpFileServer实现。...线程应该隐藏(封装)它们的私有数据和其他资源,而不是与系统的其余部分共享它们。 通过消息(事件对象)在线程之间异步通信。使用异步事件可以使线程真正独立地运行,而不会相互阻塞。...Actor之间是通过底层的线程池来实现并行。 [图片上传失败......具体的执行则有维护的线程池进行执行。Spark通信框架中各个组件(Client/Master/Worker)可以认为是一个个独立的实体,各个实体之间通过消息来进行通信。 2.
在高并发场景解决方案中,多从线程角度出发,以解决线程安全问题,锁范围又需要多业务场景考虑,何时上锁,何时解锁,何时自动过期等,而事件驱动是从执行什么操作驱动的,在软件系统的设计层面,两者关联性不大,一个强调安全...Akka 是一个用 Scala 编写的库,用于在 JVM 平台上简化编写具有可容错的、高可伸缩性的 Java 和 Scala 的 Actor 模型应用,其同时提供了Java 和 Scala 的开发接口。...Akka 对 Actor 模型的使用提供了一个抽象级别,使得编写正确的并发、并行和分布式系统更加容易。Actor 模型贯穿了整个 Akka 库,为我们提供了一致的理解和使用它们的方法。...的Reactor模型为例(redis同理),本身的Reactor模型即是从事件驱动(NeetyEventLoop)的设计模式,Netty从io角度出发,分发请求,以Reactor对象分发调用链接,结合线程池以此提高多线程高并发的吞吐量...这可以防止 Actor 之间共享状态;观察另一个 Actor 状态的唯一方法是向其发送请求状态的消息。
它是基于 JVM(Java虚拟机)的,主要使用 Scala 编程语言开发,但也提供了 Java API,因此可以在 Java 和 Scala 中使用。...并发性和并行性:Akka 允许开发人员轻松编写并发和并行代码,而不必担心底层线程管理。它处理所有与多线程编程相关的复杂性,并提供了抽象,以便开发人员可以专注于业务逻辑。...插件和扩展:Akka 提供了丰富的插件和扩展机制,可以轻松集成其他库和框架,如 Akka HTTP、Akka Streams 等,以构建全栈应用程序。...内存占用少;每GB堆可以创建约250万个actor(参与者)。 弹性和分散性 分布式系统没有单点故障,具有跨节点的负载平衡和自适应路由。...对调用堆栈的误解 传统的调用堆栈模型不适用于并发编程,因为异步任务无法通过调用堆栈传递异常或通知主线程。 异步任务执行失败时,任务状态可能丢失,需要引入新的错误信令机制以及从故障中恢复的方法。
3.2技术实现细节 实现上主要是借助了Scala 和 Akka。 Scala(Scalable Langeaue) 是一种多范式的编程语言,设计初衷是要集成面向对象编程和函数式编程 的各种特性。...Akka 是一个用 Scala 编写的库,用于简化编写容错的、高可伸缩性的 Java 和 Scala 的 Actor 模型应用。...实现上主要是利用akka框架来实现后台的actor(轻量级的线程)的创建和管理。为了使得接口的调用 更接近于openmp,利用了scala语言的特性。...可以看成是线程池。...然后每次用户进行并行操作的时候,就从线程池中分配制定的工人actor个数来执行操作。ScalaMp对象只会 在第一次被访问的时候创建,然后在整个程序周期结束前都会存在。
3.2技术实现细节 实现上主要是借助了Scala 和 Akka。...Akka 是一个用 Scala 编写的库,用于简化编写容错的、 高可伸缩性的 Java 和 Scala 的 Actor 模型应用。...实现上主要是利用akka框架来实现后台的actor(轻量级的线程)的创建和管理。 为了使得接口的调用更接近于openmp,利用了scala语言的特性。...,会在内部创建一个ActorSystem,可以看成是一个线程 环境,然后在环境中创建一个管理者actor,然后该actor会创建100个工人actor,并对它们 进行管理,可以看成是线程池。...然后每次用户进行并行操作的时候,就从线程池中分配制定 的工人actor个数来执行操作。ScalaMp对象只会在第一次被访问的时候创建,然后在整个 程序周期结束前都会存在。
一、Akka概念 Akka 是 JVM 平台上构建高并发、分布式和容错应用的工具包和运行时环境。Akka用Scala 语言编写,同时提供了 Scala 、JAVA 的开发接口。...处理并发问题就是如何保证共享数据的一致性和正确性,为什么会有保持共享数据正确性这个问题呢? 答:无非是我们的程序是多线程的,多个线程对同一个数据进行修改,若不加同步条件,势必会造成数据污染。...> 2.11 2.4.17</akka.version...实际上说明了Dispatcher Message内部是一个线程池,receive()方法实际上是从自己的Mail Box中取出消息,内部类似于调用Runnable的run方法。..."啪啪" } } } 执行类: import akka.actor.
这是一个设置,专门讨论池保持运行的热线程数,以减少处理新的传入任务的延迟。你可以在 JDK 的「ForkJoinPool 文档」中了解更多关于并行性的信息。...可共享性:Unlimited 邮箱:任意,为每个 Actor 创建一个 用例:默认调度器,Bulkheading 驱动:java.util.concurrent.ExecutorService。...可共享性:None 邮箱:任意,为每个 Actor 创建一个 用例:Bulkheading 驱动:任何akka.dispatch.ThreadPoolExecutorConfigurator。...可共享性:Unlimited 邮箱:任意,为每个 Actor 创建一个(按需) 用例:Testing 驱动:调用线程(duh) 更多调度器配置示例 配置具有固定线程池大小的调度器,例如,对于执行阻塞 IO...在Future执行阻塞调用,为线程池提供一个线程数上限,该上限适用于运行应用程序的硬件,如本节中详细介绍的那样。
本篇作为scala快速入门系列的第四十篇博客,为大家带来的是关于Akka的内容。 ?...,如创建更多的actor,或发送更多的消息,或者确定如何去响应接收到的下一个消息。...Actor是Akka中最核心的概念,它是一个封装了状态和行为的对象,Actor之间可以通过交换信息的方式进行通信,每个Actor都有自己的收件箱(Mailbox)。...通过Actor能够简化锁及线程管理,可以非常容易地开发出正确的并发程序和并行系统,Actor具有如下特性: 提供了一种高级抽象,能够简化在并发(Concurrency)/并行(Parallelism)应用场景下的编程开发..."connect" } } 好了,本期的分享就到这里了,另外scala快速入门系列暂时先告一个段落,感谢各位小伙伴的支持和鼓励!
另外进程(线程)的上下文切换也有成本:每次调度器调度线程,操作系统都要把线程的各种必要的信息,如程序计数器、堆栈、寄存器、状态等保存起来。 CPU 运算远远快于 I/O 操作。...缺点是: 会频繁地创建、销毁线程,这对系统也是个不小的开销。这个问题可以用线程池来解决。...线程池是预先创建一部分线程,由线程池管理器来负责调度线程,达到线程复用的效果,避免了反复创建线程带来的性能开销,节省了系统的资源。...因为没有多线程,在多核的机器上,也没办法实现并行执行。 参考: Node.js机制及原理理解初步 使用 libevent 和 libev 提高网络应用性能 ---- 5....Java/Scala 有个库 akka,就是 Actor 模型的实现。而 golang 的协程机制则是 CSP 模型。
+= "com.typesafe.akka" %% "akka-stream" % "2.6.10" akka Akka是JAVA虚拟机平台上构建高并发、分布式和容错应用的工具包和运行时。...Akka用Scala语言编写,同时提供了Scala和Java的开发接口。Akka处理并发的方法基于Actor模型,Actor之间通信的唯一机制就是消息传递。...context.stop(self) // 停止自己的actorRef context.system.terminate() // 关闭ActorSystem,即关闭其内部的线程池...(ExcutorService) } } } object HelloActor { /** * 创建线程池对象MyFactory,用来创建actor的对象的 */ private...val MyFactory = ActorSystem("myFactory") //里面的"myFactory"参数为线程池的名称 /** * 通过MyFactory.actorOf
zookeeper应用案例–服务器上下线动态感知 zookeeper的数据一致性原理及leader选举机制 5、java高级特性增强 Java多线程基本知识 Java同步关键词详解 java并发包线程池及在开源软件中的应用...-文件切片 maptask并行度设置 倒排索引 共同好友 6、federation介绍和hive使用 Hadoop的HA机制 HA集群的安装部署 集群运维测试之Datanode动态上下线 集群运维测试之...基本语法 HQL-DML基本语法 HIVE的join HIVE 参数配置 HIVE 自定义函数和Transform HIVE 执行HQL的实例分析 HIVE最佳实践注意点 HIVE优化策略 HIVE实战案例...编程 scala编程介绍 scala相关软件安装 scala基础语法 scala方法和函数 scala函数式编程特点 scala数组和集合 scala编程练习(单机版WordCount) scala面向对象...scala模式匹配 actor编程介绍 option和偏函数 实战:actor的并发WordCount 柯里化 隐式转换 2、AKKA与RPC Akka并发编程框架 实战:RPC编程实战 3、Spark
这是需要花一个小时才完成了,但后来我意识到程序的运行时比创建程序花费的时间更长。因此,任务并不像看起来那么容易。那可以做些什么呢?当然,我意识到我需要并行完成任务。...Java的Monitors支持两种线程同步:互斥和合作。 通过虚拟机对象锁在Java中支持的互斥操作,使多个线程能够独立地处理共享数据而不会相互干扰。合作,是通过等待和通知来实现的。...但我不能产生10万个线程来做到这一点。我需要类似线程池的东西来限制线程数。只需一个简单的循环和线程数就可以了。该解决方案看起来很好,在架构上很?, 然后我意识到我忘记了错误处理。...我找到了这样一个框架:Akka。Akka基于Erlang actor模型。如果您阅读上述问题的实现方式,则使用拉策略实现,消费者线程将在完成当前任务后执行新任务。所以我们需要等到生产者准备好了。...在Akka之后,我感受到了类似的快乐。Akka基于actors,所以actors是什么? Actors actors给你带来: 简单和高级的并发和并行抽象。 异步,非阻塞和高性能的事件驱动编程模型。
akka-stream是一套功能更加完整和强大的streaming工具库,那么如果以akka-stream为基础,设计一套能在集群环境里进行分布式多线程并行数据处理的开源编程工具应该可以是2018的首要任务...这部分我会在完成SDP项目后以akka-persistence为核心,通过akka-http,AMQP如RabitMQ等技术来实现。 ...按一般的scala和akka的编程方式编写多线程分布式数据库管理软件时一是要按照akka代码模式,使用scala编程语言的一些较深的语法;二是需要涉及异步Async调用,集群Cluster节点任务部署及...而对于SDP用户来说,具备最基本的scala知识,无需了解akka、actor、threads、cluster,只要按照SDP自定义的业务处理流模式就可以编制多线程分布式数据处理程序了。...用户可以选择对业务功能进行拆分然后分派给不同的线程或不同的集群节点进行多线程并行或分布式的运算。SDP应该为用户程序提供多线程,并行式、分布式的运算函数。
缺点: 缺点在于资源要求太高,系统中创建线程是需要比较高的系统资源的,如果连接数太高,系统无法承受,而且,线程的反复创建-销毁也需要代价。...多线程Reactor 在单线程Reactor模式基础上,做如下改进: 1. 将Handler处理器的执行放入线程池,多线程进行业务处理。 2. 对于Reactor而言,可以仍为单个线程。...Actor是异步驱动,可以并行和分布式部署及运行的最小颗粒。也就是说,它可以被分配,分布,调度到不同的CPU,不同的节点,乃至不同的时间片上运行,而不影响最终的结果。...加锁的开销很大,线程上下文切换的开销大 2. 加锁导致线程block,无法去执行其他的工作,被block无法执行的线程,其实也是占据了一种系统资源 3....actor和线程数解耦,可以创建很多actor绑定一个线程池来进行处理,no lock,no block的方式能减少资源开销,并提升并发的性能 参考 1 https://developer.aliyun.com
所以希望这个执行体能够尽量轻量级,很少的内存占用,很快的启动时间,很少的切换消耗,最好能在 IO 执行的时候自动让出计算资源。 并发和并行 我们更多关注并发,但是比较少关注并行。...并发之 Fork-join 轻量级进程模型: Fork-join 创建自己的进程池来执行小粒度的任务。...所以,一般需要将异步 IO 操作放到另外的线程池,FJ 只处理纯计算。 基于 Scala 的 Akka 既是这种模型。...所以,假如处理不当, Akka 的 Actor 很容易阻塞执行线程,如果执行线程池的线程被耗光,整个应用将会僵死在那里。而 Erlang 则没有这个问题。...元编程和 DSL 扩展性 在语法级别的抽象和封装更能提高开发效率。Elixr 中如何实现 DSL。 执行速度和性能 这点和并发并行模式、以及多核利用率密切相关。
我们学习scala Actor的目的主要是为后续学习Akka做准备。...[NOTE] scala在2.11.x版本中加入了Akka并发编程框架,老版本已经废弃。Actor的编程模型和Akka很像,我们这里学习Actor的目的是为学习Akka做准备。...---- 2.创建Actor 创建Actor的方式和Java中创建线程很类似,也是通过继承来创建。...使用方式 定义class或object继承Actor特质 重写act方法 调用Actor的start方法执行Actor [NOTE] 类似于Java线程,这里的每个Actor是并行执行的 示例...如果当前Actor没有接收到消息,线程就会处于阻塞状态 如果有很多的Actor,就有可能会导致很多线程都是处于阻塞状态 每次有新的消息来时,重新创建线程来处理 频繁的线程创建、销毁和切换,会影响运行效率
领取专属 10元无门槛券
手把手带您无忧上云