当前位置: 首页 > news >正文

3.1 actor基本框架(c#的Akka.Actor模式)

1.最简单的一个框架

代码如下(代码容易理解):

using System;
using Akka.Actor;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Security.Cryptography.X509Certificates;namespace ConsoleApp11
{// 定义Actorpublic class MyActor:ReceiveActor{public MyActor(){// 定义接收消息的行为Receive<string>(message =>{// 定义接收消息的行为Console.WriteLine($"收到消息:{message}");});}}class Program{static void Main(string[] args){// 创建 Actor系统var actorSystem = ActorSystem.Create("MyActorSystem");// 创建一个Actorvar myActor = actorSystem.ActorOf<MyActor>("MyActor");// 向Actor 发送消息myActor.Tell("hello,actor!");// 停止 Actor 系统actorSystem.Terminate().Wait();}}
}

2.加入一个数据处理的功能

代码如下:

using System;
using Akka.Actor;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Security.Cryptography.X509Certificates;namespace ConsoleApp11
{public class MyActor : ReceiveActor { public MyActor() { Receive<string>(message => { Console.WriteLine($"Received: {message}");  // 输出: Received: 1}); }protected override void PreStart() => Console.WriteLine("Actor started");  //actor的重启,  输出: Actor startedprotected override void PostStop() => Console.WriteLine("Actor stopped");  //actor的停止,  输出: Actor stopped}// 添加信息获取和信息处理类public class cacus{public cacus() { }public double tt = 1; // 这里可以获取数据public double cas() // {return tt;}}class Program{static void Main(string[] args){// 1.创建 Actor系统var actorSystem = ActorSystem.Create("MyActorSystem");// 2.创建一个Actorvar myActor = actorSystem.ActorOf<MyActor>("MyActor");// 3.获得myActor的路径(每个myActor都有自己的路径)var actorPath = myActor.Path;Console.WriteLine($"Actor Path: {actorPath}"); // 输出: Actor Path: akka://MyActorSystem/user/MyActor// 4.向Actor 发送消息var st = new cacus();var ss = st.cas();string s1 = ss.ToString();myActor.Tell(s1);// 5.停止 Actor 系统actorSystem.Terminate().Wait();}}
}

运行结果如下:

3.两个actor同时运行

该内容看了博客C# Actor 如何理解和使用?-CSDN博客,作为笔记用。

以下是一个简单的例子,展示如何通过消息传递实现“A完成后再通知B执行”的逻辑。

1. 定义 Actor A 和 Actor B

  • Actor A:完成任务后发送消息给Actor B。
  • Actor B:接收到消息后执行自己的任务。

代码如下:

using System;
using Akka.Actor;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Security.Cryptography.X509Certificates;namespace ConsoleApp11
{// Actor Apublic class ActorA : ReceiveActor { private readonly IActorRef _actorB;public ActorA(IActorRef actorB) { _actorB = actorB; Receive<string>(message => { Console.WriteLine("Actor A is working..."); // 模拟任务完成Task.Delay(1000).Wait(); // 模拟耗时操作Console.WriteLine("Actor A has finished its task."); // 通知 Actor B_actorB.Tell("A has finished, B can start now."); });}} // Actor Bpublic class ActorB : ReceiveActor { public ActorB() { Receive<string>(message => {Console.WriteLine("Actor B received a message: " + message); Console.WriteLine("Actor B is working..."); // 模拟任务完成Task.Delay(1000).Wait(); // 模拟耗时操作Console.WriteLine("Actor B has finished its task."); }); } }class Program{static void Main(string[] args){//创建 ActorSystemvar system = ActorSystem.Create("MySystem"); // 创建 Actor Bvar actorB = system.ActorOf<ActorB>("actorB"); // 创建 Actor A,并传入 Actor B 的引用var actorA = system.ActorOf(Props.Create(() => new ActorA(actorB)), "actorA"); // 触发 Actor A 开始工作actorA.Tell("Start"); Console.ReadLine(); }}}

运行结果如下:

2.关键点

  1. 消息传递:Actor A完成任务后,通过Tell方法发送消息给Actor B。
  2. 异步通信:Actor之间的通信是异步的,不会阻塞对方的执行。
  3. 解耦:Actor A和Actor B是完全独立的,它们之间没有直接的依赖,仅通过消息协作。

4.更复杂的协作

内容来自博客C# Actor 如何理解和使用?-CSDN博客,作为笔记用.

如果需要多个Actor协作(例如A -> B -> C),可以通过类似的方式实现:

  • Actor A完成任务后通知Actor B。
  • Actor B完成任务后通知Actor C。

代码如下:

using System;
using Akka.Actor;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Security.Cryptography.X509Certificates;namespace ConsoleApp11
{// Actor Apublic class ActorA : ReceiveActor { private readonly IActorRef _actorB;public ActorA(IActorRef actorB) { _actorB = actorB; Receive<string>(message => { Console.WriteLine("Actor A is working..."); // 模拟任务完成Task.Delay(1000).Wait(); // 模拟耗时操作Console.WriteLine("Actor A has finished its task."); // 通知 Actor B_actorB.Tell("A has finished, B can start now."); });}} // ctor B,使其完成任务后通知 Actor Cpublic class ActorB : ReceiveActor{ private readonly IActorRef _actorC;public ActorB(IActorRef actorC){ _actorC = actorC;Receive<string>(message => {Console.WriteLine("Actor B received a message: " + message); Console.WriteLine("Actor B is working..."); Task.Delay(1000).Wait(); // 模拟耗时操作Console.WriteLine("Actor B has finished its task."); // 通知Actor C _actorC.Tell("B has finished, C can start now."); }); }}// Actor Cpublic class ActorC : ReceiveActor {public ActorC(){ Receive<string>(message => { Console.WriteLine("Actor C received a message: " + message);Console.WriteLine("Actor C is working..."); Task.Delay(1000).Wait();// 模拟耗时操作Console.WriteLine("Actor C has finished its task."); });} } class Program{static void Main(string[] args){//创建 ActorSystemvar system = ActorSystem.Create("MySystem");// 创建 Actor Cvar actorC = system.ActorOf<ActorC>("actorC");// 创建 Actor B,并传入 Actor C 的引用var actorB = system.ActorOf(Props.Create(() => new ActorB(actorC)), "actorB");// 创建 Actor A,并传入 Actor B 的引用var actorA = system.ActorOf(Props.Create(() => new ActorA(actorB)), "actorA");// 触发 Actor A 开始工作actorA.Tell("Start"); Console.ReadLine();}}}

运行结果如下:

后续会继续更新

相关文章:

3.1 actor基本框架(c#的Akka.Actor模式)

1.最简单的一个框架 代码如下&#xff08;代码容易理解&#xff09;&#xff1a; using System; using Akka.Actor; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Security.Cryptography.X509Certi…...

Git使用[同一电脑多个账户ssh-key的管理]

同一电脑多个账户ssh-key的管理 现在遇到一个问题,我同一台电脑既要通过VPN访问内网的git也要访问对外释放的gitee,刚开始我直接把原来的SSH-key添加到内网的gitlab发现可以访问,但是后来再方位外网的gitee就出问题了,看来要换一种手段才行 本文引用&#xff1a;https://cloud…...

使用Python结合`stable-baselines3`库(包含PPO和TD3算法)以及`gym`库来实现分层强化学习的示例代码

以下是一个使用Python结合stable-baselines3库&#xff08;包含PPO和TD3算法&#xff09;以及gym库来实现分层强化学习的示例代码。该代码将环境中的动作元组分别提供给高层处理器PPO和低层处理器TD3进行训练&#xff0c;并实现单独训练和共同训练的功能。 代码实现 import g…...

【论文笔记】MambaGlue: Fast and Robust Local Feature Matching With Mamba

【引用格式】&#xff1a;Ryoo K, Lim H, Myung H. MambaGlue: Fast and Robust Local Feature Matching With Mamba[J]. arXiv preprint arXiv:2502.00462, 2025. 【网址】&#xff1a;https://arxiv.org/pdf/2502.00462 【开源代码】&#xff1a;https://github.com/uri-Ka…...

基于 Stanford CoreNLP 的中文自然语言处理

一、概述 Stanford CoreNLP 是斯坦福大学开发的一款强大的自然语言处理&#xff08;NLP&#xff09;工具&#xff0c;支持多种语言的文本处理&#xff0c;包括中文。本文将详细介绍如何使用 Stanford CoreNLP 实现中文文本的分词、词性标注、命名实体识别、句法分析等功能&…...

python 量化交易入门到提升详细教程,python量化交易教程

文章目录 前言入门阶段1. 环境准备安装 Python选择开发环境安装必要的库 2. 金融数据获取3. 简单策略构建 - 移动平均线交叉策略 进阶阶段1. 策略回测2. 风险管理3. 多因子策略4. 机器学习在量化交易中的应用5. 高频交易策略 前言 Python 作为一门功能强大、易于学习且应用广泛…...

如何设置爬虫的访问频率?

设置爬虫的访问频率&#xff08;即请求间隔&#xff09;是确保爬虫稳定运行并避免对目标服务器造成过大压力的关键步骤。合理的访问频率不仅可以减少被目标网站封禁IP的风险&#xff0c;还能提高爬虫的效率。以下是一些设置爬虫访问频率的方法和最佳实践&#xff1a; 1. 使用s…...

前端循环全解析:JS/ES/TS 循环写法与实战示例

循环是编程中控制流程的核心工具。本文将详细介绍 JavaScript、ES6 及 TypeScript 中各种循环的写法、特性&#xff0c;并通过实际示例帮助你掌握它们的正确使用姿势。 目录 传统三剑客 for 循环 while 循环 do...while 循环 ES6 新特性 forEach for...of for...in 数组…...

大气体育直播模板赛事扁平自适应模板源码

源码名称&#xff1a;大气体育直播模板赛事网站源码 开发环境&#xff1a;帝国cms 7.5 安装环境&#xff1a;phpmysql 模板特点&#xff1a; 程序伪静态版本&#xff0c;实时采集更新&#xff0c;无人值守&#xff0c;省心省力。带火车头采集&#xff0c;可以挂着自动采集发布…...

vue3学习1

vite是新的官方构建工具&#xff0c;构建速度比webpack更快 vue项目的入口文件是index.html&#xff0c;一般在这里引入src/main.js&#xff0c;并且设置好容器#app App.vue放的是根组件&#xff0c;components里放分支组件 vue组件中写三种标签&#xff0c;template & s…...

java机器学习计算指标动态阈值

java机器学习计算指标动态阈值 最近听到有的人说要做机器学习就一定要学Python&#xff0c;我想他们掌握的知道还不够系统全面。本文作者以动态阈值需求场景给大家介绍几种常用Java实现的机器学习库&#xff0c;包括使用开源库如Weka或Deeplearning4j&#xff08;DL4J&#xf…...

mac os设置jdk版本

打开环境变量配置文件 sudo vim ~/.bash_profile 设置不同的jdk版本路径 # 设置JAVA_HOME为jdk17路径 export JAVA_HOME$(/usr/libexec/java_home -v 17)# 设置JAVA_HOME为jdk8路径 export JAVA_HOME$(/usr/libexec/java_home -v 1.8) 设置环境变量 # 将jdk加入到环境变量…...

Python正则表达式学习

Python正则表达式全攻略 一、正则表达式基础 1. 什么是正则表达式&#xff1f; 用于描述字符串匹配规则的表达式广泛应用于文本处理、表单验证、数据清洗等领域 2. Python中的re模块 import re3. 基础语法 字符说明示例.匹配任意字符(除换行)a.c → abc\d数字 [0-9]\d\d …...

ShenNiusModularity项目源码学习(10:ShenNius.FileManagement项目分析)

ShenNiusModularity项目支持七牛云和本地图片存储&#xff0c;其文件上传接口及实现就位于ShenNius.FileManagement项目内&#xff0c;该项目内文件不多&#xff0c;主要就是围绕上传本地及七牛云的实现及相关类定义。   扩展类FileManagemenServiceExtensions的AddFileUploa…...

mysql查看binlog日志

mysql 配置、查看binlog日志&#xff1a; 示例为MySQL8.0 1、 检查binlog开启状态 SHOW VARIABLES LIKE ‘log_bin’; 如果未开启&#xff0c;修改配置my.ini 开启日志 安装目录配置my.ini(mysql8在data目录) log-binmysql-bin&#xff08;开启日志并指定日志前缀&#xff…...

Node.js高频面试题精选及参考答案

目录 什么是 Node.js?它的主要特点有哪些? Node.js 的事件驱动和非阻塞 I/O 模型是如何工作的? 为什么 Node.js 适合处理高并发场景? Node.js 与传统后端语言(如 Java、Python)相比,有哪些优势和劣势? 简述 Node.js 的运行原理,包括 V8 引擎的作用。 什么是 Nod…...

TaskBuilder创建客户信息列表页面

3.4.1选择页面类型 点击上面创建的customer文件夹右侧的加号&#xff0c;打开“前端资源创建向导”对话框&#xff0c;选中“数据查询TFP”&#xff0c;资源名称会自动设置为index&#xff0c;这里我们不用改。 点“下一步”按钮&#xff0c;会弹出下图所示的“创建数据查询T…...

Linux Iptables示例一则

个人博客地址&#xff1a;Linux Iptables示例一则 | 一张假钞的真实世界 关于Iptables的介绍个人强烈推荐&#xff1a;iptables-朱双印博客-第2页。这位兄弟介绍的很详细。 我个人的需求是在同一个网络内从网络上把测试主机与正式环境主机间的网络进行隔离。我的思路是采用OU…...

新手小白如何挖掘cnvd通用漏洞之存储xss漏洞(利用xss钓鱼)

视频教程和更多福利在我主页简介或专栏里 &#xff08;不懂都可以来问我 专栏找我哦&#xff09; 如果对你有帮助你可以来专栏找我&#xff0c;我可以无偿分享给你对你更有帮助的一些经验和资料哦 目录&#xff1a; 一、XSS的三种类型&#xff1a; 二、XSS攻击的危害&#x…...

【CXX】4 跨平台构建系统特性对比

多语言构建系统选项为开发团队提供了灵活性和选择&#xff0c;以适应不同的项目需求和现有的技术栈。CXX作为一个设计灵活的工具&#xff0c;旨在与多种构建系统无缝集成。以下是对不同构建系统选项的简要概述和建议&#xff1a; 一、Cargo&#xff1a; 适用场景&#xff1a;…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...