c# 初识Actor Model

最近学了点 c# dataflow的一些东西,然后国外有个人,用dataflow来实现了,一个Actor模型;

这里做个比较,算是初识我们的actor模型,然后我们再进一步的深入了解一哈;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading.Tasks.Dataflow;

namespace Actor_Model
{
    //actor model 的基本使用和示例;
    //https://blog.jayway.com/2013/11/15/an-actor-model-implementation-in-c-using-tpl-dataflow/#comment-463337

    public abstract class Message { }

    //把所有的action 都通过meg的 形式表达出来;

    //吧我们的每一动作都看成了信息;让后将信息传递出去,真正的执行,交给我们的具体的actor去执行滴呀;
    public class Deposit : Message
    {

        public decimal Amount { get; set; }
    }
    //To check the balance we send a QueryBalance message
    public class QueryBalance : Message
    {
        //The result of the query should be sent as a message to another actor
        //也就是说查询出来的信息又交给了另外一个actor 处理了滴呀;信息之间的传递;
        public Actor Receiver { get; set; }
    }

    //The final message is the result of the balance chec
    public class Balance : Message
    {
        public decimal Amount { get; set; }
    }

    public abstract class Actor
    {

        private readonly ActionBlock<Message> _action;

        public Actor()
        {
            _action = new ActionBlock<Message>((msg =>
              {
                  dynamic self = this;
                  dynamic mess = msg;
                  self.Handle(mess);

              }));

        }

        public void Send(Message msg)
        {
            _action.Post(msg);
        }

        public Task Completion
        {
            get
            {
                _action.Complete();
                return _action.Completion;
            }
        }

    }

    //Each account has a balance. We want to be able to deposit money and check the balance
    //实际动作的执行者;
    public class AccountActor : Actor
    {
        private decimal _balance;

        //存钱
        public void Handle(Deposit msg)
        {
            _balance += msg.Amount; //deposite money
        }
        //查询余额
        public void Handle(QueryBalance msg)
        {
            //查询出来的余额,叫给我们的额新actor去处理;
            //相当于创建一个新的acto
            msg.Receiver.Send(new Balance { Amount = _balance });
        }

    }
    //We also need an actor that outputs the result of the balance query
    public class OutputActor : Actor
    {
        public void Handle(Balance msg)
        {
            Console.WriteLine("Balance is {0}", msg.Amount);
        }

    }

    class Program
    {
        static void Main(string[] args)
        {

            var account = new AccountActor();
            var output = new OutputActor();

            account.Send(new Deposit { Amount = 50 });
            account.Send(new QueryBalance { Receiver = output });

            account.Completion.Wait();
            output.Completion.Wait();

            Console.WriteLine("Done!");
            Console.ReadLine();

        }
    }
}

看完基本了解actor,但是还是很不透彻~

时间: 2024-10-05 19:48:23

c# 初识Actor Model的相关文章

C++多线程开发之actor model

最近想把写过的一个多线程程序整理一下,这个程序主要特点是有一系列的互相之间有依赖关系的task.于是在网上找相关类库 1,一类是简单的线程池了,这也是原本俺的做法.之前使用的是手工调度,代码实现的很蛋疼.外面的lib有poco https://pocoproject.org/slides/130-Threads.pdf2,Intel TBB, MS PPL (Parallel Patterns Library)之类的类库,感觉这里一类本质上和1没有大的分别3,微软的并行库1)MS PPL (Pa

2014.8.12-AKKA和Actor model 分布式开发环境学习小结

学习使用AKKA 断断续续有一年了.目前还是习惯用java来写akka下面的程序.对于原生的scala还是没有时间和兴趣去学习它. 毕竟学习一门语言需要兴趣和时间的. AKKA学习资源还是不算丰富. 看过最多的就是官方的编程手册,还有就是AKKA Essentials 这两本.  自己动手写的程序还不算多,也放在github上面. 另外,在akka编译配置.升级版本上,以及部署多台服务器组建akka cluster 方面花费了不少时间.因为项目需要,上周重新在办公室用两台mac台式机和一台thi

用actor model实现intel tbb这样的用法

关于什么事actor model,什么事intel tbb这样的用法我就不详细说了,具体请上网查文档 class MyActor { F f; MyActor inputs[]; MyActor outputs[]; int n; #internal void run() { f(); for o in outputs: sendMsg(o, this) } ##1 void addOutput(o) { outputs.append(o); } ##2 void onFirstRun() {

Actor Model

The actor model in computer science is a mathematical(数学的) model of concurrent computation(计算)  that treats "actors" as the universal primitives(通用原语) of concurrent computation: in response to a message that it receives, an actor can make local

Actor初识

Akka -构建与JVM上的 高并发.分布式和可快速恢复的消息驱动应用的工具集        我们相信编写出正确的具有容错性和可扩展性的并发程序太困难了.这多数是因为我们使用了错误的工具和错误的抽象级别.Akka就是为了改变这种状况而生的.通过使用Actor模型我们提升了抽象级别,为构建正确的可扩展并发应用提供了一个更好的平台(工具). 那什么是 actor模型? (Actor model)是一种并发运算上的模型."参与者"是一种程序上的抽象概念,被视为并发运算的基本单元:当一个参与者

.NET的Actor模型:Orleans

Orleans是微软推出的类似Scala Akka的Actor模型,Orleans是一个建立在.NET之上的,设计的目标是为了方便程序员开发需要大规模扩展的云服务, 可用于实现DDD+EventSourcing/CQRS系统. 传统的三层体系结构包括无状态的前端,无状态的中间层和存储层在可伸缩性方面是有限制的,由于存储层在延迟和吞吐量方面的限制,这对于每个用户请求都有影响.通常办法是在中间层和存储层之间添加缓存层来提高性能.然而,缓存会失去了大部分的并发性和底层存储层的语义保证.为了防止缓存和存

actor

_timcharper1月 20 02:18 @timcharper , so what app the actor model can help, and what app the thread modle can help, could you please give me some advice? say, a heavy traffic app, for example a instant message server is ok using actor model, bussy log

ActorLite: 一个轻量级Actor模型实现

Actor模型 Actor模型为并行而生,具Wikipedia中的描述,它原本是为大量独立的微型处理器所构建的高性能网络而设计的模型.而目前,单台机器也有了多个独立的计算单元,这就是为什么在并行程序愈演愈烈的今天,Actor模型又重新回到了人们的视线之中了.Actor模型的理念非常简单:天下万物皆为Actor,Actor之间通过发送消息进行通信.Actor模型的执行方式有两个特点: 每个Actor,单线程地依次执行发送给它的消息. 不同的Actor可以同时执行它们的消息. 对于第1点至今还有一些

Akka 2 Actor 源码

Actor源码研究,先附上源码 // ...... object Actor {   /**    * Type alias representing a Receive-expression for Akka Actors.    */   //#receive   type Receive = PartialFunction[Any, Unit]   //#receive   /**    * emptyBehavior is a Receive-expression that matche