登陆

不一样的并发编程:Actor 并发编程模型

admin 2019-09-07 236人围观 ,发现0个评论


传统的并发编程咱们都很了解,以 Java 举例,那便是经过同享内存和锁的办法来进行并发操控。但你有没有想过还有其他办法能够完结高并发呢?今日咱们就来看看 Actor 并发编程模型,并从共同性和阻隔性的视点来剖析为什么有 Actor 并发编程模型。

一.Actor模型介绍

在单核 CPU 开展现已到达一个瓶颈的今日,要添加硬件的速度更多的是添加 CPU 核的数目。而针对这种状况,要使咱们的程序运转功率进步,那么也应该从并发方面下手。传统的多线程办法又极端简略呈现 Bug 而难以保护,不过别忧虑,今日即将介绍另一种并发的形式能必定程度处理这些问题,那便是 Actor 模型。

Actor 模型其实便是界说一组规矩,这些规矩规矩了一组体系中各个模块怎么交互及回应。在一个 Actor 体系中,Actor 是最小的单元模块,体系由多个 Actor 组成。每个 Actor 有两个东西,一个是 mailbox,一个是本身状况。一起 Actor 有接纳和不一样的并发编程:Actor 并发编程模型发送的功用。下面用 scala 代码给出一个大约的 Actor 样例:当一个 Actor 接纳到音讯后,它会履行下面三种操作中的一种:


  • 创立其他 Actors。
  • 向其他 Actors 发送音讯。
  • 修正本身状况。

需求留意的是,虽然许多 Actors 一起运转,可是一个 Actor 只能次序地处理音讯。也便是说其它 Actors 发送了三条音讯给一个 Actor,这个 Actor 只能一次处理一条。所以假如你要并行处理3条音讯,你需求把这条音讯发给3个 Actors。

下面这张图展现了一个简略的 Actor 模型体系:

了解了 Actor 模型的大约规矩后,咱们用两个详细的比方来看看 Actor 模型的妙处以及缺乏吧。

二. 两个比方

2.1 素数核算

假定咱们现在有一个使命,需求找出100000以内素数个数,而且运用多线程的办法完结。

下图展现了运用同享内存的办法和以Actor模型的办法进行并发履行。

这儿展现了两种处理并发的不同思路,传统的办法是经过锁/同步的办法来完结并发,每次同步获取当时值,并让一个线程去判别值是否为素数,是的话再经过同步的办法对计数器加1(这儿的阐明仅仅作为供给思路用,这种办法天然有很大的优化空间)。

而运用 Actor 模型则不相同,它将这一进程拆分红几个模块,即拆分红几个 Actor 。每个 Actor 担任不同的部分,经过音讯传递的办法让这几个 Actor 协同作业,而且其间涉及到首要核算的 Actor 能够有多个,经过多个 Actor 协同作业完结并发。

2.2 银行转账

银行转账的使命描绘很简略,假定有两个用户,现在用户A向用户B转账100元,这个 Actor 模型该怎么规划呢?

用户 A 和 用户 B 显着是两个 Actor 广州东站,但咱们一起还需求一个能够操控用户A Actor 和用户B Actor 的 Actor ,咱们称之为 转账管家 Actor。那么流程图如下。

能够看到,当一个转账需求过来的时分,Actor 管家会先向 用户A Actor 发送扣款 100 元的信息,接受到扣款成功音讯后再发送音讯给用户B Actor,发送让其添加 100 元的音讯。

全部看起来都很夸姣是吧,但这儿面有一个问题,那便是在用户A Actor 扣款期间,用户B Actor 是不受约束的不一样的并发编程:Actor 并发编程模型,此刻对用户B Actor 进行操作是合法的!举个比方你就理解了,假定 A 向 B 转账 100 元,这在共同性强的环境下, A 账户削减 100 ,不一样的并发编程:Actor 并发编程模型B 账户添加 100 ,然后 B 才干转账给他人。而在不一样的并发编程:Actor 并发编程模型 Actor 中,或许 A 削减了 100 之后,B 还没添加 100,这时分 B 又向 C 转账 50,B 的账户会先削减 50 ,然后再添加 100,这就很简略发生一些脏读,幻读等问题。对这种状况单纯的Actor模型就显得比较乏力了,需求参加其他机制以确保共同性。

看到这你就理解了,Actor 模型并非全能的,它有必定的缺陷。那便是针对共同性要求比较强的场景比较乏力。

三. 为什么会呈现 Actor 模型

在聊为什么之前,咱们需求先说说事物并发中的 共同性 和 阻隔性 。

共同性即让数据保持共同,比方银行转账比方中,用户A 转给用户B 100块钱,没有其他搅扰的状况下,转账完结时。用户A 的账户必定削减 100 元,用户B 的账户必定添加100 元,这就满意了共同性。不能说用户A 削减50 或用户B 添加了 200。

阻隔功能够理解为献身一部分的共同性需求,而取得功能的进步。打个比方,在完全共同的状况下,使命都是串行的,这时分也就不存在阻隔性了。

理解这些之后,你就直到为什么会有 Actor 模型了。

传统并发形式,同享内存是倾向于强共同性弱阻隔性的。比方失望锁/同步的办法,其实便是运用强共同性的办法操控并发。而Actor 模型天然是强阻隔性且弱共同性,所以 Actor 模型在并发中有杰出的功能,且易于操控和办理。

这样你就理解 Actor 模型适合于什么样的并发场景了,当对共同性需求不是很高的状况下且对功能需求较高时,Actor 模型无疑是一个值得测验的计划。 比方现在许多分布式结构中(Hadoop,Spark等),他们之间的 RPC 通讯就多是用 Actor 模型而非传统的并发编程来完结。

需求的Java架构师方面的材料能够重视之后私信哈,回复“材料”收取免费架构视频材料,记住关键赞转发噢!!!

请关注微信公众号
微信二维码
不容错过
Powered By Z-BlogPHP