并行模型Actor

并行开发时经常需要关注加锁和原子操作等一系列线程问题,而Actor模型内部状态由它自己维护,内部数据只能自己修改,因此Actor不需要过多关注线程问题。

Actor模型

Actor由状态(State)、邮箱(Mailbox)和行为(Behavior)组成。

NewLife.Model.Actor 设计为一个轻量级Actor模型,麻雀虽小五脏俱全!

/// <summary>无锁并行编程模型</summary>
/// <remarks>
/// 独立线程轮询消息队列,简单设计避免影响默认线程池。
/// 适用于任务颗粒较大的场合,例如IO操作。
/// </remarks>
public interface IActor
{/// <summary>添加消息,驱动内部处理</summary>/// <param name="message">消息</param>/// <param name="sender">发送者</param>/// <returns>返回待处理消息数</returns>Int32 Tell(Object message, IActor sender = null);
}

IActor 接口设计为只有一个Tell方法,用于传递要发通知给目标Actor。这里的message可以列极为状态(State)。目标Actor内部有个队列收集信息,该队列可以认为是邮箱(Mailbox)。Actor内部有独立线程去读取 邮箱数据进行处理,即是行为(Behavior)!

从某种程度上来讲,Actor就是一个队列加上独立线程。如果该队列设计为分布式队列,那么这个Actor就成了真正的分布式并行模型。(如果Actor配上RedisQueue又会怎么样呢?

Actor可以一个接着一个,串联起来,形成分布式并发处理集群。尽管是分布式系统,然而所有代码完全不需要考虑多线程问题。

总之,Actor模型的理念非常简单:万物皆Actor!

应用例程

我们来看一段测试代码,默认读取数据库然后生成Excel文件,两步都是比较耗时的操作。

[Fact]
public async void Test1()
{var sw = Stopwatch.StartNew();var actor = new BuildExcelActor();for (var i = 0; i < 6; i++){// 模拟查询数据,耗时500msXTrace.WriteLine("读取数据……");await Task.Delay(500);// 通知另一个处理器actor.Tell($"数据行_{i + 1}");}// 等待最终完成actor.Stop();sw.Stop();Assert.True(sw.ElapsedMilliseconds > 6 * 500);Assert.True(sw.ElapsedMilliseconds < 6 * 500 + 500);
}
private class BuildExcelActor : Actor
{protected override async Task ReceiveAsync(ActorContext context){XTrace.WriteLine("生成Excel数据:{0}", context.Message);await Task.Delay(500);}
}

新建一个实现类继承Actor,重写ReceiveAsync,实现Actor行为(业务逻辑)。此时独占线程,所以无需考虑多线程问题。

跑起来看看日志输出

从上图可以看出,主逻辑和Actor是并行执行。主逻辑把数据送给Actor后,继续去读取下一页,无需等待Actor生成完成。

总结

XCode的实体延迟队列,就是一个货真价实的Actor模型。主逻辑只管处理业务,数据保存操作由另一个Actor完成。

此处为语雀文档,点击链接查看:https://www.yuque.com/go/doc/7553851

DAL的数据导出、恢复和备份,也是Actor模型,主逻辑操作数据库,独立Actor负责写入文件,相比同一段逻辑完成该操作大概提升一倍性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305625.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux cache fs,新闻|Linux 上将出现一个新的文件系统:bcachefs

这个有 5 年历史&#xff0c;由 Kent Oberstreet 创建&#xff0c;过去属于谷歌的文件系统&#xff0c;最近完成了全部关键组件。Bcachefs 文件系统自称其性能和稳定性与 ext4 和 xfs 相同&#xff0c;而其他方面的功能又可以与 btrfs 和 zfs 相媲美。主要特性包括校验、压缩、…

cad单位_CAD制图初学入门常用技巧汇总,CAD零基础也不怕!

CAD制图初学入门的小萌新们&#xff0c;最苦恼的莫过于&#xff1a;千辛万苦&#xff0c;好不容易安装的CAD软件&#xff0c;在实际CAD设计绘图中&#xff0c;居然遭遇各种问题。没有CAD制图初学入门教程、缺乏CAD大神指点、CAD图纸资源极度匮乏&#xff0c;CAD小萌新们的成长之…

跟本菜菜一起去体验Microsoft Windows Server Code Name Longhorn Server Core

消失的菜菜又回来了,这段时间由于很多原因没及时更新blog,忘大家见谅…还记得菜菜以前给大家介绍的Microsoft Windows Server Longhorn吗?今天我给大家带来Microsoft Windows Server Code Name "Longhorn” server core.也许很多人都听说过吧?!我在简单的给大家做个简单…

乐视android版本点四下,EUI5.9+Android7.0刷机包

乐视EUI5.9系统刷机包&#xff0c;乐视更新了EUI5.9&#xff0c;不仅有语音助手还有iPhone的小白点悬浮球&#xff0c;功能齐全&#xff0c;界面简单&#xff0c;实在是应该给程序员点个赞&#xff01;乐视EUI5.9系统刷机包更新内容&#xff1a;设置 新增悬浮球功能管家 新增应…

得出来的视差图左边有黑色补上原图_掌握这10个抠图方法,帮你轻松应对大部分抠图工作!(动图演示...

新手只要掌握今天这10个方法&#xff0c;就足够对付绝大部分的抠图工作了。1、橡皮擦工具橡皮擦工具&#xff0c;更多时候跟“抠图”看似没啥关系&#xff0c;然而&#xff0c;竟然它能起到“擦除”的作用&#xff0c;那么就完全可以用来抠图去背了&#xff0c;它的键盘快捷键是…

win10右键一直转圈_Win10电脑开机一直转圈无法进入系统的解决方法

相信很多用户在安装Win10系统之后&#xff0c;常常会出现一些问题&#xff0c;其中就有电脑开不了机一直在转圈的情况&#xff0c;那么遇到电脑开机一直在转圈怎么办呢&#xff1f;下面笔者就针对这一情况和大家介绍Win10系统电脑开不了机一直在转圈的解决方法。解决方法开机马…

跨平台导PDF,结合wkhtmltopdf很顺手

前言好东西要分享&#xff0c;之前一直在使用wkhtmltopdf进行pdf文件的生成&#xff0c;常用的方式就是先安装wkhtmltopdf&#xff0c;然后在程序中用命令的方式将对应的html生成pdf文件&#xff0c;简单而且方便&#xff1b;但重复的编码使得想在wkhtmltopdf基础上进行封装&am…

ueditor如何设置上传图片的高度宽度_怎么设置天猫主图

天猫主图很多人都设置过&#xff0c;不过&#xff0c;新手第一长主图往往不是很在行&#xff0c;所以也不懂怎么设置&#xff1f;那今天&#xff0c;麦顶电商就给大家科普下关于天猫长主图的知识&#xff0c;想要学习设置长主图的店主&#xff0c;这期的内容也正好适合你们。用…

鸿蒙系统2020正式版,鸿蒙2.0来了!华为开发者大会HDC 2020宣布

原标题&#xff1a;鸿蒙2.0来了&#xff01;华为开发者大会HDC 2020宣布华为官方宣布&#xff0c;2020年度华为开发者大会“HDC Together”将于9月10日至9月12日在东莞松山湖举办&#xff0c;早鸟门票明天起开售。根据预告&#xff0c;本次大会将带来主题演讲、技术论坛、行业大…

洋哥!我要进大厂!

阅读本文大概需要4分钟。最近不少读者咨询洋哥如何进大厂&#xff0c;回答的多了就想着要不整理出一个系列文章出来。说干就干&#xff0c;第一期先写写应届毕业和刚工作不久的计算机专业的童鞋如何进大厂。先说说必须要做到的几件事&#xff1a;第一&#xff0c;学校内的课程&…

调整png的不透明度_TGA与PNG的优劣对比

一、TGA与PNG的特点&#xff08;一&#xff09;PNG 解码混乱 不稳定 有时候不能识别 放在AE里呈像杂质&#xff0c;斑点极多。PNG相当于视频格式中AVI。而TGA 更接近原始格式&#xff0c;更安全稳定&#xff0c;两者质量单独的最优无损情况下效果差不多。图1TGA格式二值化后放到…

这难道不是.NET5的bug? 在线求锤?

hello&#xff0c;最近在对一个使用.NET5项目的认证授权系统进行重构&#xff0c;对.NET 5的授权中间件的源码有些看法。也希望同学们能帮我理解。一个朴素的需求这是一个api项目&#xff0c;默认所有的api都需要授权&#xff0c; 少量散落在Controller各处的api不需要授权访问…

win2008r2用户账户控制什么意思_养老保险统筹账户是什么意思?有什么用?

我国《社会保险法》规定&#xff1a;基本养老保险实行统筹账户和个人账户相结合的方式。对于在职职工来说&#xff0c;养老保险费分为单位缴费和个人缴费两部分&#xff1b;单位一般按照缴费基数的20%划入到统筹账户中&#xff0c;个人按照缴费基数的8%计入到个人账户里&#x…

android手机拍摄权限,react-native 手机拍照权限

第一步 &#xff1a;在 android/app/src/main/AndroidManifest.xml添加然后运行项目在手机应用权限哪里查看这是添加前的这是添加后的第二步调用import React, {Component} from react;import {View,Text,Image,StyleSheet,Button,Modal,TouchableHighlight,TouchableOpacity,D…

idea 一直在build_让web开发部署提速 8 倍的一款 IDEA 插件,你有在用?

原文:http://suo.im/4on4JE 来源于云栖社区>中间件小哥作为一个 Java 程序员&#xff0c;我们大多数会在 Intellij IDEA 中基于 SpringBoot 来开发 WEB 应用&#xff0c;所以本文中的测评将会基于以下几个架构来构建&#xff1a;开发环境&#xff1a;IDEA项目组织方式&…

Android 调用12306接口,GitHub - AndroidyxChen/loading-12306: 仿PC端12306的刷新loading的自定义view...

loading-12306仿PC端12306的刷新loading的自定义view效果图&#xff1a;核心代码及实现逻辑如下&#xff1a;mPaint.setColor(mColor);mPaint.setTextSize(50);//1、动画开启前&#xff0c;theCircle的初始值为-1&#xff0c;所以初始化时只走canvas.drawCircle()方法&#xff…

FreeBSD 下的 MySQL 备份方案

作/译者&#xff1a;叶金荣&#xff08;Email: &#xff09;&#xff0c;来源&#xff1a;http://imysql.cn&#xff0c;转载请注明作/译者和出处&#xff0c;并且不能用于商业用途&#xff0c;违者必究。核心提示&#xff1a;如何在 FreeBSD 下实现 MySQL 的全量及增量备份&am…

IdentityServer4(八)使用EntityFramework Core对数据进行持久化

上几篇&#xff0c;我们创建了客户端&#xff0c;scope&#xff0c;启动时&#xff0c;IdentityServer把这些配置数据加载至内存&#xff0c;但是&#xff0c;如果我们想要更改配置&#xff0c;就必须停掉IdentityServer&#xff0c;然后重新启动。且IdentityServe在r运行过程中…

centos 重启网卡_CentOS7网络配置和修改网卡名称及常用服务管理命令

1.设置IP地址和网关及DNSCentOS7里面的网卡名称不在是eth0,1,2而改成enoxxxxxx的格式&#xff0c;en代表的是enthernet以太网&#xff0c;o代表onboard内置&#xff0c;这种新的方式不但长&#xff0c;而且难记&#xff0c;不过优点也比较突出&#xff0c;有编号唯一性&#xf…

C# 中的动态类型

翻译自 Camilo Reyes 2018年10月15日的文章 《Working with the Dynamic Type in C#》 [1] .NET 4 中引入了动态类型。动态对象使您可以处理诸如 JSON 文档之类的结构&#xff0c;这些结构的组成可能要到运行时才能知道。在本文中&#xff0c;Camilo Reyes 解释了如何使用动态…