区别:goroutine实现的是csp,通过独立的channel传递信息。akka实现的是actor,消息通过actor拥有mailbox接收。akka是通过线程池实现的actor,线程是有限的,而goroutine运行在用户态线程上,受go运行时抢占式调度。二者都是通过消息通信的机制来避免竞态条件,但具体的抽象和实现上有些差异。
goroutine实现的是csp,通过独立的channel传递信息。akka实现的是actor,消息通过actor拥有mailbox接收。
仅仅上面的不够特化。akka是通过线程池实现的actor,线程是有限的,假如一个actor阻塞一个线程(例如一个阻塞io),可能会影响其他的actor,类似于协调型的调度。而goroutine运行在用户态线程上,受go运行时抢占式调度。
二者都是通过消息通信的机制来避免竞态条件,但具体的抽象和实现上有些差异。
CSP模型里消息和Channel是主体,处理器是匿名的。
也就是说发送方需要关心自己的消息类型以及应该写到哪个Channel,但不需要关心谁消费了它,以及有多少个消费者。Channel一般都是类型绑定的,一个Channel只写同一种类型的消息,所以CSP需要支持alt/select机制,同时监听多个Channel。Channel是同步的模式(Golang的Channel支持buffer,支持一定数量的异步),背后的逻辑是发送方非常关心消息是否被处理,CSP要保证每个消息都被正常处理了,没被处理就阻塞着。
Actor模型里Actor是主体,Mailbox(类似于CSP的Channel)是透明的。也就是说它假定发送方会关心消息发给谁消费了,但不关心消息类型以及通道。所以Mailbox是异步模式,发送者不能假定发送的消息一定被收到和处理。Actor模型必须支持强大的模式匹配机制,因为无论什么类型的消息都会通过同一个通道发送过来,需要通过模式匹配机制做分发。它背后的逻辑是现实世界本来就是异步的,不确定(non-deterministic)的,所以程序也要适应面对不确定的机制编程。自从有了并行之后,原来的确定编程思维模式已经受到了挑战,而Actor直接在模式中蕴含了这点。
延伸阅读:
什么是go?
Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。
Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。
罗伯特·格瑞史莫(Robert Griesemer),罗布·派克(Rob Pike)及肯·汤普逊(Ken Thompson)于2007年9月开始设计Go,稍后Ian Lance Taylor、Russ Cox加入项目。Go是基于Inferno操作系统所开发的。Go于2009年11月正式宣布推出,成为开放源代码项目,并在Linux及Mac OS X平台上进行了实现,后来追加了Windows系统下的实现。在2016年,Go被软件评价公司TIOBE 选为“TIOBE 2016 年优异语言”。 目前,Go每半年发布一个二级版本(即从a.x升级到a.y)。
文章标题:scala的akka和go的goroutine有什么区别,发布者:小编,转载请注明出处:https://worktile.com/kb/p/38585