国外做任务的网站,教育类网站设计,网站建设流程步骤怎么样,贵州住房和城乡建设厅官方网站并行开发时经常需要关注加锁和原子操作等一系列线程问题#xff0c;而Actor模型内部状态由它自己维护#xff0c;内部数据只能自己修改#xff0c;因此Actor不需要过多关注线程问题。Actor模型Actor由状态#xff08;State#xff09;、邮箱#xff08;Mailbox#xff0… 并行开发时经常需要关注加锁和原子操作等一系列线程问题而Actor模型内部状态由它自己维护内部数据只能自己修改因此Actor不需要过多关注线程问题。Actor模型Actor由状态State、邮箱Mailbox和行为Behavior组成。NewLife.Model.Actor 设计为一个轻量级Actor模型麻雀虽小五脏俱全/// summary无锁并行编程模型/summary
/// remarks
/// 独立线程轮询消息队列简单设计避免影响默认线程池。
/// 适用于任务颗粒较大的场合例如IO操作。
/// /remarks
public interface IActor
{/// summary添加消息驱动内部处理/summary/// param namemessage消息/param/// param namesender发送者/param/// returns返回待处理消息数/returnsInt32 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/7553851DAL的数据导出、恢复和备份也是Actor模型主逻辑操作数据库独立Actor负责写入文件相比同一段逻辑完成该操作大概提升一倍性能。