Actor模型
程序员文章站
2022-05-26 14:20:31
#Actor模型 Actor的目的是为了解决分布式编程中的一系列问题。所有消息都是异步交付的,因此将消息发送方与接收方分开,正是由于这种分离,导致actor系统具有内在的并发性:可以不受限制地并行执行任何拥有输入消息的 actor。用Actor写的程序可以不用管是怎么实现的,只用传递数据就可以,操作 ......
#actor模型
actor的目的是为了解决分布式编程中的一系列问题。所有消息都是异步交付的,因此将消息发送方与接收方分开,正是由于这种分离,导致actor系统具有内在的并发性:可以不受限制地并行执行任何拥有输入消息的 actor。用actor写的程序可以不用管是怎么实现的,只用传递数据就可以,操作简单。当然actor的nb之处,还在于可以远程连接,像rpc一样。下面的例子用的是nuget中的【akka】、远程的【akka.remote】
#actor的特点
> 1. 系统由actor构成
> 2. actor完全独立
> 3. 消息传递是非阻塞和异步的
> 4. 所有消息都是并行的
#actor使用
> 可以通过特定的actor工具或直接使用编程语言实现actor模型,目前c#语言中有两类比较流行,akka.net框架和orleans框架。
> 1. akka是一个基于scala语言的actor模型库,旨在构建一套高并发、分布式、自动容错、消息驱动应用的工具集。
> 2. orleans框架可以构建大规模、高并发、分布式应用程序,而不需要学习专业分布式以及并发知识框架。它是由微软研究和设计应用于云计算。
简单actor例子
public class actordemo { public static void test() { var system = actorsystem.create("test"); var greeter = system.actorof<jasonactor>("jason"); for (int i = 0; i < 100; i++) { task.run(() => //异步发送数据 { var id = math.abs(guid.newguid().gethashcode()); greeter.tell(new jasonmessage() { id = id, name = $"{datetime.now.ticks} {id} {i} " }); }); } } } /// <summary> /// actor可接受消息处理 /// </summary> public class jasonactor : receiveactor { public jasonactor() { receive<jasonmessage>(greet => { console.writeline($"当前时间:{datetime.now.ticks}, name:{greet.name}, id:{greet.id} "); }); } } /// <summary> /// 用于传递消息的实体类 /// </summary> public class jasonmessage { public long id { get; set; } public string name { get; set; } }
远程actor
/// <summary> /// 用于传递消息的实体类(公共类库) /// </summary> public class jasonmessage { public long id { get; set; } public string name { get; set; } }
//actor客户端 namespace akkaclient { class program { static void main(string[] args) { var config = configurationfactory.parsestring(@" akka { actor { provider = ""akka.remote.remoteactorrefprovider, akka.remote"" } remote { helios.tcp { transport-class = ""akka.remote.transport.helios.heliostcptransport, akka.remote"" applied-adapters = [] transport-protocol = tcp port = 0 hostname = localhost } } } "); using (var system = actorsystem.create("myclient", config)) { var greeting = system.actorselection("akka.tcp://myserver@localhost:51179/user/greeting"); while (true) { var input = console.readline(); if (input != "exit") { var id = math.abs(guid.newguid().gethashcode()); greeting.tell(new jasonmessage() { id = id, name = $"{datetime.now} {input} " }); } else { break; } } } console.writeline("hello world!"); } } }
//actor服务端 namespace serverakka { class program { static void main(string[] args) { var config = configurationfactory.parsestring(@" akka { actor { provider = ""akka.remote.remoteactorrefprovider, akka.remote"" } remote { helios.tcp { transport-class = ""akka.remote.transport.helios.heliostcptransport, akka.remote"" applied-adapters = [] transport-protocol = tcp port = 51179 hostname = localhost } } } "); using (var system = actorsystem.create("myserver", config)) { system.actorof<jasonactor>("greeting"); console.readline(); } console.writeline("hello world!"); } } public class jasonactor : untypedactor { protected override void onreceive(object greet) { var greet1 = (jasonmessage)greet; console.writeline($"当前时间:{datetime.now.ticks}, name:{greet1.name}, id:{greet1.id} "); } } }
上一篇: 即使是高考结束了也不能松懈呢
下一篇: AI简单制作一个漂亮的红黄色板
推荐阅读
-
ASP.NET MVC4入门教程(五):从控制器访问数据模型
-
ASP.NET MVC4入门教程(四):添加一个模型
-
ASP.NET MVC4入门教程(七):给电影表和模型添加新字段
-
Android应用程序模型之应用程序,任务,进程,线程分析
-
Java多线程Queue、BlockingQueue和使用BlockingQueue实现生产消费者模型方法解析
-
详解Android Libgdx中ScrollPane和Actor事件冲突问题的解决办法
-
详解 Android中Libgdx使用ShapeRenderer自定义Actor解决无法接收到Touch事件的问题
-
HTML连载39-外边距合并现象、盒子模型以及宽度和高度
-
ASP.NET MVC数组模型绑定详解
-
C#获取Visio模型信息的简单方法示例