C#的Actors有什么好的实现?

时间:2010-02-02 17:33:04

标签: c# .net concurrency actor

.net / c#是否有actors concurrency model的良好实现?

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

13 个答案:

答案 0 :(得分:51)

.NET Actor Model框架:

Proto.Actor

  • 演员
  • 虚拟演员

https://github.com/AsynkronIT/protoactor-dotnet

Akka.NET

  • 演员

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

Microsoft Orleans

  • 虚拟演员

https://github.com/dotnet/orleans

答案 1 :(得分:24)

人们也可以看一下演员奥尔良微软的方法(上周发布)

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

这也是2014年版本作为介绍

的好话

使用Orleans在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

答案 2 :(得分:22)

您应该查看MS Concurrency & Coordination Runtime (CCR)Decentralized Software Services (DSS) Robotic Studio的一部分。

这些框架将允许您开发松散耦合的服务,以满足大多数演员方法要求。

Axum将是最合适的,不幸的是它仍处于某种alpha / beta阶段(更新它已于2011年2月被杀)。我用它进行研究,必须说总体方向很好,而且潜力巨大。

不是C#,但C ++是Microsoft的Asynchronous Agents Library,它为您提供了所需的所有功能。

好好了解.NET 4的Parallel related features

希望它有所帮助!

答案 3 :(得分:18)

Stact

.Net上的actor-lib。相当称职和经过充分测试。 TopShelf,MassTransit和NServiceBus.Host的基础。

https://github.com/phatboyg/stact

包含抽象:

  • 工作流程,允许定义和执行复杂的状态驱动协议
  • 频道,支持在对象之间传递消息
  • 演员,无论是打字的还是匿名的
  • Fibers,一种合作线程模型
  • 路由
  • 请求/应答
  • 调度程序

待办:

  • 适当的主管层级

在克里斯写作时积极发展。

概述:

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

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

答案 4 :(得分:13)

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

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

它的工作原理是将对象包装在处理线程切换的代理中。所有正常的.NET功能,特别是事件,都可以正确处理,因此您可以编写正常的代码,线程编组将自行完成。

甚至有一个支持C#5 async / await的分支。

答案 5 :(得分:5)

今天微软宣布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现已推出,并且还有video tutorial

答案 6 :(得分:4)

我不知道C#的任何实现,但是有一种基于Microsoft模型的全新编程语言。它被称为Axum

  

Axum(以前代号为Maestro)是一种特定于域的并发编程语言,基于Actor模型,由Microsoft开发。它是一种基于.NET公共语言运行时的面向对象语言,它使用类似C语言的语法,它是一种特定于域的语言,用于开发非常适合并发的软件应用程序部分。但是它包含足够的通用构造,不需要为并发组件的顺序部分切换到通用编程语言(如C#)。

答案 7 :(得分:2)

您是否考虑过F#的邮箱处理器?

答案 8 :(得分:2)

您还应该考虑PostSharp Actors

答案 9 :(得分:1)

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

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

答案 10 :(得分:0)

FSharp.Actor

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()
    )

向'schizo'演员发送两条消息会导致

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

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

输出:

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

githubdocs

处找到它

答案 11 :(得分:0)

刚刚注意到这个问题,并考虑添加一个更新的数据点。微软目前有一个半官方项目,名为ActorFX。它是开源的,但仍在不断发展,但值得关注......

答案 12 :(得分:0)

如前所述,F#的MailboxProcessor类提供了一个简单,直接的actor模型实现。有关如何使用它的精彩介绍here。 F#与C#非常好地互操作,您可以使用发布不同消息的方法将代理程序包装在一个类中。对于代理将使用异步响应进行回复的情况,请参阅PostAndAsyncReply方法。这将返回一个Async工作流,您可以使用Async.StartAsTask方法将其转换为可在C#中等待的任务。

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