任何好的C#演员的实现?

.net / c#有没有很好的执行actor并发模型 ?

我必须优化交stream#例程,我认为演员模型完全适合我的问题的解决scheme。 不幸的是,我只有scala实现的经验。

您应该看看MS Concurrency&Coordination Runtime(CCR)和分散软件服务(DSS) ,它是Robotic Studio的一部分。

这些框架将允许您开发松散耦合的服务,以满足大多数参与者的需求。

阿克苏姆将是最合适的,不幸的是它仍然处于某种alpha / beta阶段(更新它已经在2011年2月被杀害)。 我用它来研究,必须说大方向很大,有巨大的潜力。

不是C#,但C ++是微软的asynchronous代理库 ,它提供了你所需要的所有function。

仔细看看.NET 4的并行相关function 。

希望能帮助到你!

.NET Actor模型框架:

Proto.Actor

  • 演员
  • 虚拟演员

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

Akka.NET

  • 演员

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

微软奥尔良

  • 虚拟演员

https://github.com/dotnet/orleans

也可以看一下Project Orleans Microsofts对演员的方法(上周发布)

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

从2014年开始,这也是一个很好的话题

使用Orleans在Azure中构buildHalo 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

Stact

.Net上的一个actor-lib。 非常有能力和良好的testing。 TopShelf,MassTransit和NServiceBus.Host的基础。

https://github.com/phatboyg/stact

包含抽象:

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

即将开始的:

  • 适当的主pipe层级

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

概述:

开发并发应用程序需要一种不同于当前软件开发方法的方法,这种方法强调自治系统组件之间的并发和通信。 参与者模型定义了一个称为参与者的软件组件系统,它们通过交换消息而彼此交互(而不是在面向对象的devise中调用接口上的方法),生成一个系统,其中数据(而不是控制)通过组件stream动系统的function要求。

Stact是一个使用.NET中的actor模型构build应用程序的库。 主程序集Stact.dll是演员库,包含在任何types的应用程序中使用演员模型所需的所有内容。 还有一些额外的支持框架,比如Stact.ServerFramework,可以用来通过套接字或者HTTP暴露angular色,允许使用angular色来构build服务。

NAct是.NET的一个演员框架,它采用了一个非常简单易用的方法。 (免责声明:我写了)

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

它的工作原理是将你的对象封装在一个处理线程切换的代理中。 所有正常的.NET特性,特别是事件,都是正确处理的,所以你可以编写正常的代码,线程编组就可以自行完成。

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

今天,微软公布了根据这张图片的Azure Service Fabric,实现了一个演员编程模型:

Azure服务结构

查看公告: http : //azure.microsoft.com/blog/2015/04/20/announcing-azure-service-fabric-reducing-complexity-in-a-hyper-scale-world/

更新: SDK现在可用,还有一个video教程 。

我不知道C#的任何实现,但有一个基于微软的Actor模型的全新编程语言。 这就是所谓的阿克苏姆 :

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

你有没有考虑过与F#提供的T的MailboxProcessor?

你也应该考虑PostSharp演员

Remact.Net是我目前的项目。 它使用WebSockets和Json作为远程参与者消息。 它具有C#参与者的types安全性,但也支持用Java脚本编写的基于浏览器的参与者的dynamictypes。

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

虽然这个问题已经得到了答案,我想添加一个链接给你考虑。 这是基于消息的并发的实现,这个库可以从这里获得

请享用。

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 

在github和docs上find它

只是注意到这个问题,并认为增加了一个新的数据点。 微软目前有一个名为ActorFX的半官方项目。 这是开源的,仍在不断发展,但值得关注…

如前所述,F#的MailboxProcessor类提供了一个简单,直接的actor模型实现。 关于如何使用它的一个梦幻般的介绍可以在这里find 。 F#与C#互操作性非常好,您可以使用发布不同消息的方法将代理包装到类中。 对于代理将以asynchronous响应回复的情况,请参阅PostAndAsyncReply方法。 这将返回一个asynchronous工作stream程,您可以使用Async.StartAsTask方法将其转化为可以在C#中等待的任务。

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