对于 C # ,Actors 有什么好的实现吗?

对于.net/c # 有没有很好的 行为者并发模型行为者并发模型实现?

我必须优化一个 c # 例程,我认为演员模型非常适合作为我的问题的解决方案。不幸的是,我只有 Scala 实现的经验。

39538 次浏览

我不知道 C # 有什么实现,但是有一种全新的编程语言是基于微软的 Actor 模型的。它叫 阿克萨姆:

Axum(以前的代号为 Maestro)是一种特定于领域的并发编程语言,基于 Actor 模型,由 Microsoft 开发。它是一种面向对象的语言,基于。NET 通用语言运行库使用类似于 C 的语法,作为一个领域特定语言,用于开发软件应用程序中适合并发的部分。但是它包含了足够多的通用结构,对于并发组件的连续部分,不需要切换到通用编程语言(比如 C #)。

你应该看看 MS 并发和协调运行时(CCR),和 分散式软件服务(DSS)机器人工作室的一部分。

这些框架将允许您开发松散耦合的服务,以满足多数角色方法需求。

Axum 将是最合适的选择,不幸的是,它仍处于某种 alpha/beta 阶段(更新于2011年2月被终止)。我把它用于我的研究,必须说,总的方向是伟大的,它有巨大的潜力。

不是 C # 而是 C + + 是微软的 异步代理库,它提供了所有你需要的特性。

好好看看.NET 4的 平行相关的特征

希望能有帮助!

你有没有考虑过提供 F # 的 T 邮箱处理器?

斯塔特

一个演员-自由的。网络。相当能干和良好的测试。基础的 TopShelf,大众运输和 NServiceBus。主机。

Https://github.com/phatboyg/stact

包含抽象概念:

  • 工作流,允许定义和执行复杂的状态驱动协议
  • 信道,以支持对象之间的消息传递
  • 演员,有打字的,也有匿名的
  • 纤维,一种协同线程模型
  • 路由
  • 请求/答复
  • 调度员

接下来:

  • 适当的主管等级制度

在克里斯撰写本文时正在积极开发。

概述:

开发并发应用程序需要一种有别于当前软件开发方法的方法,这种方法强调并发性和自治系统组件之间的通信。角色模型定义了一个被称为角色的软件组件系统,这些软件组件通过交换消息(而不是在面向对象设计的接口上调用方法)相互交互,生成一个系统,其中数据(而不是控制)通过组件流动以满足系统的功能需求。

中使用角色模型构建应用程序的库。NET.主程序集 Stact.dll 是角色库,包括在任何类型的应用程序中使用角色模型所需的所有内容。还有其他的支持框架,比如 Stact。ServerFramework,可用于通过套接字或 HTTP 公开参与者,允许使用参与者构建服务。

NAct 是一个.NET 的角色框架,它采用了一种非常容易使用的方法。(免责声明: 这是我写的)

在两个参与者之间传递的消息只是两个对象之间的方法调用。您必须确保所有的方法参数都是不可变的,并且它是线程安全的。

它的工作原理是将对象包装在处理线程切换的代理中。一切正常。NET 特性,特别是事件,被正确处理,所以你可以编写正常的代码和线程封送处理将自行发生。

甚至还有一个支持 C # 5异步/等待的分支。

Remact. Net 是我目前的项目,它使用 WebSockets 和 Json 来进行远程角色消息传递。 它为 C # 角色提供了类型安全性,但也支持用 Java 脚本编写的基于浏览器的角色的动态类型。

我以前的项目是 AsyncWcfLib。这是一个用于在进程中或不同应用程序之间进行通信的参与者的 C # 库。远程消息传递使用 WCF。
Actor 目录服务允许在多个主机上发现 Actor,这些主机可以运行 Windows 或 Linux

你也应该考虑 PostSharp Actors

FSharp 演员

F # 的参与者框架。

举个例子:

let rec schizoPing =
(fun (actor:IActor<_>) ->
let log = (actor :?> Actor.T<_>).Log
let rec ping() =
async {
let! (msg,_) = actor.Receive()
log.Info(sprintf "(%A): %A ping" actor msg, None)
return! pong()
}
and pong() =
async {
let! (msg,_) = actor.Receive()
log.Info(sprintf "(%A): %A pong" actor msg, None)
return! ping()
}
ping()
)

向“精神分裂”参与者发送两条消息会导致

let schizo = Actor.spawn (Actor.Options.Create("schizo")) schizoPing


!!"schizo" <-- "Hello"
!!"schizo" <-- "Hello"

产出:

(schizo): "Hello" ping
(schizo): "Hello" pong

Github医生找到它

只是注意到这个问题,并想添加一个新的数据点。微软目前有一个半官方的项目,称为 特技演员。它是开源的,并且仍在发展中,但是值得关注..。

.NET 角色模型框架:

原型,演员

  • 演员
  • 虚拟演员

Https://github.com/asynkronit/protoactor-dotnet

Akka. NET

  • 演员

Https://github.com/akkadotnet/akka.net

微软奥尔良

  • 虚拟演员

Https://github.com/dotnet/orleans

人们可能还会看到微软在演员方面所采取的方法(上周发布)

这是项目网站: Http://research.microsoft.com/en-us/projects/orleans/

这里也有一个来自 build 2014的很好的介绍

在 Azure 中使用黄金搭建 Halo 4的分布式云服务 Http://channel9.msdn.com/events/build/2014/3-641

请注意,今天发布的下载位是 CTP。

奥尔良简介: http://felixnotes.com/orleans-microsofts-take-on-the-actor-pattern-in-net/

是的,它也是开源的: https://github.com/dotnet/orleans

如前所述,F # 的 MailboxProcessor 类提供了一个简单、直接的角色模型实现。关于如何使用它的一个奇妙的介绍是可用的 给你。F # 与 C # 的互操作非常好,您可以使用发布不同消息的方法将代理包装在一个类中。对于代理将以异步响应应答的情况,请参见 回复方法。这将返回一个 Async 工作流,您可以使用 异步,启动任务方法将其转换为可在 C # 中等待的任务。

最后,如果您需要远程分发角色,我建议您查看同时提供 C # 和 F # API 的 Akka. NET

今天微软发布了 Azure Service Fabric,它实现了一个角色编程模型:

Azure Service Fabric

请看声明: http://azure.microsoft.com/blog/2015/04/20/announcing-azure-service-fabric-reducing-complexity-in-a-hyper-scale-world/

更新: SDK现在已经可用,还有一个 视频教程