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

在上一篇文章中,我们实现了一个简单的Actor模型。如果要构建一个Actor,便只是 简单地继承Actor<T>类型并实现其Receive方法即可。在上次文章的末尾,我们使 用C#演示了该Actor模型的使用。不过现在我们将尝试一下F#。

C#使用Actor模型的缺陷

在Erlang中,每个消息都使用模式匹配来限制其“结构”或“格式”,以此表达不同 含义。C#类型系统的抽象能力远胜于Erlang,但是Erlang的“动态性”使得开发人员可以 在程序中随意发送和接收任何类型,这种“自由”为Erlang带来了灵活。我们的Actor模 型中,每个Actor对象都需要一种特定的消息格式,而这种消息格式承担了“表现Actor所 有职责”的重任,但是一个Actor的职责是可能由任何数据组合而成。例如一段最简单的 “聊天”程序,其Actor表示了一个“人”,用Erlang实现可能就会这么写:

loop() ->
   receive
     % 系统要求发起聊天,于是向对方打招呼
     {start, Person} ->
       Person ! {self(), {greeting, "你好")},
       loop();

     % 有人前来发起聊天,于是向对方说了点什么
     {Person, {greeting, Message}} ->
       Person ! {self(), {say, "..."}},
       loop();

     % 有人前来说话,于是拜拜
     {Person, {say, Message}} ->
       Person ! {self(), {bye, "..."}},
       loop();

     ...
   end.

不同的元组(tuple)配合不同的原子(atom)便表示了一条消息的“含义”,但是使 用C#您又该怎样来表现这些“命令”呢?您可能会使用:

使用object[]作为消息类型,并检查其元素。

使用object作为消息类型,并判断消息的具体类型。

使用枚举或字符串代表“命令”,配合一个参数集合。

第1种做法十分麻烦;第2种则需要“先定义,后使用”也颇为不易;而第3种做法,平 心而论,如果有一个“分发类库”的支持就会比较理想——可能比这篇文章中的F#还要理 想。老赵正在努力实现这一功能,因为C#的这个特性会影响到.NET平台下所有Actor模型 (如第一篇文章中所提到的CCR或Retlang)的使用。

而目前,我们先来看看F#是否可以略为缓解一下这方面的问题。

在F#中使用Actor模型

Erlang没有严谨的类型系统,其“消息类型”是完全动态的,因此非常灵活。那么F# 又有什么“法宝”可以解决C#中所遇到的尴尬呢?在现在这个问题上,F#有三个领先于C# 的关键:

灵活的类型系统

强大的模式匹配

自由的语法

虽然F#也是强类型的编译型语言(这点和C#一致),但是F#的类型系统较C#灵活许多 ,例如在“聊天”这个示例中,我们就可以编写如下类型作为“消息”类型:

type Message = string
type ChatMsg =
   | Start of Person
   | Greeting of Person * Message
   | Say of Person * Message
   | Bye of Person * Message

时间: 2024-09-14 11:48:21

ActorLite:一个轻量级Actor模型实现(下)的相关文章

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

从上一篇文章的反响来看,似乎大家对于这一话题并没有太大兴趣.而这篇文章将会 为大家带来一个简单但完整的Actor模型实现.此外,在下一篇文章中--可能会出现一 些让您觉得有趣的东西.:) 任务分配逻辑 如上文所述,这次要实现的是一个非常简单的Actor模型,使用基于事件的分配方式, 直接把任务交给.NET自带的线程池去使用.不过我们又该什么时候把一个Actor推入线程 池的执行队列呢?这其实取决于我们执行Actor的两个"基本原则": 如果Actor的邮箱中包含消息,那么要尽早执行.

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

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

【转载】actor 模型的优缺点分析介绍

      actor 模型是 1973 年就提出的一个分布式并发编程模型,在 erlang 语言中得到广泛支持和应用.目前 java中 也出现了很多支持 actor模型的库:akka.killim.jetlang等等,其中 akka 是使用 scala 写的,有 scala 和 java 两套使用接口:killim 需要对编译出来的 class 文件进行后处理. 最近项目需要架构整改,以支撑后续的发展,正在考虑是否采用 actor 模型. actor 模型有什么优点和缺点? actor 模型和

基于嵌入式多处理器的轻量级MapReduce模型研究

基于嵌入式多处理器的轻量级MapReduce模型研究 随着近年来云计算的快速发展以及多核处理器核心数的快速增长,并行开发技术的应用也越来越普遍.各种并行开发技术如MPI.OpenMP等已经非常成熟的应用于各个领域,并且在Google的MapReduce编程模型的带动下出现了很多基于MapReduce模型的开发框架,如Phoenix.Metis.Hadoop等,但是Phoenix和Metis是基于共享内存架构实现的,不能用于分布式集群,而Hadoop集群部署在嵌入式环境下的执行效率不高.因此目前还

一个轻量级分布式RPC框架--NettyRpc

1.背景 最近在搜索Netty和Zookeeper方面的文章时,看到了这篇文章<轻量级分布式 RPC 框架>,作者用Zookeeper.Netty和Spring写了一个轻量级的分布式RPC框架.花了一些时间看了下他的代码,写的干净简单,写的RPC框架可以算是一个简易版的dubbo.这个RPC框架虽小,但是麻雀虽小,五脏俱全,有兴趣的可以学习一下. 本人在这个简易版的RPC上添加了如下特性: * 服务异步调用的支持,回调函数callback的支持 * 客户端使用长连接(在多次调用共享连接) *

一个用于Gnome桌面的下拉式终端: Guake 0.7.0 发布

一个用于Gnome桌面的下拉式终端: Guake 0.7.0 发布 Linux的命令行是最好.最强大的东西,它使新手着迷,并为老手和极客的提供极其强大的功能.那些在服务器和生产环境下工作的人早已认识到了这个事实.有趣的是,Linux终端是Linus Torvald在1991年写内核时实现的第一批功能之一. 终端是个强大的工具,由于它没有什么可调整的部分,所以十分可靠.终端介于控制台环境和GUI环境之间.终端自身作为一个GUI程序,运行在桌面环境下.有许多终端是适用于特定的桌面环境的,其它的则是通

一个轻量级的javascript库 pj介绍_lib_js

相对于其他语言来说,javascript脚本语言太小巧玲珑了,活泼灵动.个人非常喜欢写javascript代码.虽说网络上出名的javascript库充斥网络,jQuery.Prototype.Base.ExtJs--,功能也非常强大,使用起来也方便.但是有一个不太令人满意的地方,就是库本身太大了.有时只是用其中几个功能就必须得把整个库引进来,就jQuery来说,压缩了也还有70多KB,有时比一个网页文件还大.但我们有需要一个库来协助开发,所以自己就写了一个轻量级的javascript库,只支持

如果你建造了一个精良的模型却没人用,你肯定不会得到赞誉(转)

  注:本文编译自 How to do Data Science ,作者 Brandon Rohrer 为微软高级数据科学家. <哈佛商业评论>曾宣称"数据科学家"是二十一世纪最性感的职业.所谓性感,既代表着难以名状的诱惑,又说明了大家对它又不甚了解. 如何做好数据科学呢? 微软高级数据科学家 Brandon Rohrer 概括了做数据科学的七大步骤,手把手教你做数据科学. 1. 获取更多的数据 数据科学的原材料是数字和名称的集合,测量.价格.日期.时间.产品.标题.行动等

Akka v2.4.11 发布,Actor 模型开发库

Akka v2.4.11 发布了. Akka 是一个用 Scala 编写的库,用于简化编写容错的.高可伸缩性的 Java 和 Scala 的 Actor 模型应用. 改进内容,请点击此处查看.更多详情请关注发行日志和提交记录. 文章转载自 开源中国社区 [http://www.oschina.net]