actor模型(代码片段)

zhao123 zhao123     2022-12-20     656

关键词:

#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://[email protected]: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 ");
        
    

 

共享内存&actor并发模型到底哪个快?(代码片段)

...几天被.NET圈纪检委@懒得勤快问到共享内存和Actor并发模型哪个速度更快。前文传送门:《三分钟掌握共享内存&Actor并发模型》说实在,我内心10w头羊驼跑过.....先说结论1.首先两者对于并发的风格模型不一样。共享... 查看详情

day861.actor模型-java并发编程实战(代码片段)

Actor模型:面向对象原生的并发模型Hi,我是阿昌,今天学习记录的是关于Actor模型:面向对象原生的并发模型的内容。上学的时候,有门计算机专业课叫做面向对象编程,学这门课的时候有个问题困扰࿰... 查看详情

day861.actor模型-java并发编程实战(代码片段)

Actor模型:面向对象原生的并发模型Hi,我是阿昌,今天学习记录的是关于Actor模型:面向对象原生的并发模型的内容。上学的时候,有门计算机专业课叫做面向对象编程,学这门课的时候有个问题困扰࿰... 查看详情

akka基础概念(代码片段)

...集,用于协调远程计算资源来进行一些工作,是Actor开发模型的一种现代化实现。2.Actor重要概念与消息传递方式重要概念1.Actor:一个表示工作节点的并发原语,同步处理接收到的消息,Actor可以保存并修改内部状态。2.消息:用... 查看详情

scala的actor(代码片段)

...cala中的actor能够实现并行编程的强大功能,他是基于事件模型的并发机制,scala是运用消息(message)的发送、接收来实现多线程的(Java是使用共享内存实现的)。使用Scala能够更容易地实现多线程应用的开发。??一个actor是一个... 查看详情

scala框架akka学习(代码片段)

...Scala框架AkkaAkka概述Akka特点Akka与Scala.actors.Actor的关系Akka模型介绍Actor模型的优点Akka模型的核心概念如何创建Actor添加依赖在Akka中,Actor负责通信,在Actor中有一些重要的生命周期方法**akka的架构原理**创建Actor的步骤receive... 查看详情

scala笔记整理:actor和akka(代码片段)

...于Java中的多线程编程。但是不同的是,Scala的Actor提供的模型与多线程有所不同。Scala的Actor尽可能地避免锁和共享状态,从而避免多线程并发时出现资源争用的情况,进而提升多线程编程的性能。Spark中使用的分布式多线程框架... 查看详情

scala笔记整理:actor和akka(代码片段)

...于Java中的多线程编程。但是不同的是,Scala的Actor提供的模型与多线程有所不同。Scala的Actor尽可能地避免锁和共享状态,从而避免多线程并发时出现资源争用的情况,进而提升多线程编程的性能。Spark中使用的分布式多线程框架... 查看详情

actor分布式并行计算模型:theactormodelforconcurrentcomputation(代码片段)

...题和增加调试难度。我们有个替换的方案,叫做Actor模型。两种分布式计算模式:Actor和流水线分布式计算的本质就是在分布式环境下,多个进程协同完成一件复杂的事情,但每个进程各司其职,完成自己的工作后&#... 查看详情

rust实践:使用tokio实现actor系统(代码片段)

...在我之前的文章里也讲过Actor系统是什么C++Actor并发模型框架ActorFramework(CAF),介绍的是C++ 查看详情

深度强化学习actor-critic模型解析,附pytorch完整代码(代码片段)

...一种综合了策略迭代和价值迭代的集成算法。我将使用该模型结合OpenAI中的Gym环境完成一个小游戏,完整代码可以从我的GitHub中获得:https://github.com/LiSir-HIT/Reinforcement-Learning/tree/main/Model1.算法原理根据agent选择动作方法的... 查看详情

scala学习并发编程模型akka(代码片段)

一,Akka简介二,Akka中的Actor模型三,Akka实战案例之HelloActor四,Akka实战案例之PingPong五,案例基于Actor的聊天模型    正文一,Akka简介  写并发程序很难。程序员不得不处理线程、锁和竞态条件等等,这个过程很... 查看详情

actor模型及原理

1.Actor模型在使用Java进行并发编程时需要特别的关注锁和内存原子性等一系列线程问题,而Actor模型内部的状态由它自己维护即它内部数据只能由它自己修改(通过消息传递来进行状态修改),所以使用Actors模型进行并发编程可以很... 查看详情

flink之间的组件通信(代码片段)

...广泛的概念。是akka或者netty具体的某一种实现。akka与actor模型akka是一个并发、容错和可伸缩应用的框架。基本所有框架都有这几个优点。每个actor都是一个单一的线程,它不断地从其邮箱中poll(拉取)消息,并且连续不断地处... 查看详情

actor模型

  Actor模型在并发编程中是比较常见的一种模型。很多开发语言都提供了原生的Actor模型。例如erlang,scala等。  Actor,可以看作是一个个独立的实体,他们之间是毫无关联的。但是他们可以通过消息来通信。一个Actor收到其他A... 查看详情

actor模型和csp模型的区别

...:http://www.jdon.com/concurrent/actor-csp.html Akka/Erlang的actor模型与Go语言的协程Goroutine与通道Channel代表的CSP(CommunicatingSequentialProcesses)模型有什么区别呢?  首先这两者都是并发模型的解决方案,我们看看Actor和Channel这两个方案的... 查看详情

Akka 的 Actor 与 Scala 的 Actor 模型有啥区别

】Akka的Actor与Scala的Actor模型有啥区别【英文标题】:What\'sthedifferenceoftheAkka\'sActorwithScala\'sActormodelAkka的Actor与Scala的Actor模型有什么区别【发布时间】:2012-03-1015:11:29【问题描述】:我发现还有一个AkkaActor模型,所以我想知道Akka... 查看详情

actor模型

actor是一种面向对象的线程(池)模型,强调对事件的响应;在iOS中相当于一种通信简化的runloop模型; 对比:数据结构化的线程模型,侧重于强调线程拥有的资源(栈、优先级、状态等); 每一个actor背后都有一个线程... 查看详情