有很好的Actors for C#实现吗?[关闭]


75

.net / c#是否有任何好的Actor并发模型实现?

我必须优化ac#例程,并且我认为参与者模型非常适合作为我的问题的解决方案。不幸的是,我只有scala实现方面的经验。


Answers:


22

您应该看看MS并发与协调运行时(CCR)和去中心化软件服务(DSS),它是Robotic Studio的一部分。

这些框架将允许您开发满足大多数参与者方法要求的松耦合服务。

Axum将是最合适的,不幸的是,它仍处于某种alpha / beta阶段(UPDATE已于2011年2月被杀死)。我将其用于研究,必须指出总体方向是巨大的,它具有巨大的潜力。

不是C#,而是C ++是Microsoft的异步代理库,它为您提供了所需的所有功能。

深入了解.NET 4的并行相关功能

希望能帮助到你!


6
我在这里找到了:code.google.com/p/retlang
alex25'2

感谢您的全面答复。
Borba 2010年

TPL数据流包含了C#建立代理商/演员块
Dzmitry Lahoda

ccrdss链接现在已死-在此处讨论了TPL数据流(TDF):msdn.microsoft.com/en-us/concurrency/default.aspx和此处:msdn.microsoft.com/en-us/devlabs/gg585582(尽管我想第二个链接迟早会过时,在发布此评论时,TDF仍处于预览阶段
SteveWilkinson 2011年


56

.NET Actor模型框架:

原型演员

  • 演员们
  • 虚拟演员

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

Akka.NET

  • 演员们

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

微软奥尔良

  • 虚拟演员

https://github.com/dotnet/orleans


这个开源项目也有一些好的前途github.com/louthy/language-ext //日志进程var logger = spawn <string>(“ logger”,Console.WriteLine); // ping处理ping = spawn <string>(“ ping”,msg => {tell(logger,msg); tell(pong,“ ping”,TimeSpan.FromMilliseconds(100));}); // Pong进程pong = spawn <string>(“ pong”,msg => {tell(logger,msg); tell(ping,“ pong”,TimeSpan.FromMilliseconds(100));}); //触发tell(pong,“ start”);
Dasith Wijes

25

也许还可以看看Orleans Microsoft Project对演员的方法(上周发布)。

这是项目的网站: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


1
不幸的是它关系到你在Azure ...
书斋

2
我认为它最好与Azure一起运行(因为它来自Microsoft),但不一定需要,但不能100%确定。
silverfighter 2014年

看来,即使开发商不知道:) orleans.codeplex.com/discussions/543928
书斋


哪三个最合适?
杰拉德(Gerard)

18

机体

.Net上的actor-lib。非常称职并且经过了良好的测试。TopShelf,MassTransit和NServiceBus.Host的基础。

https://github.com/phatboyg/stact

包含抽象:

  • 工作流程,允许定义和执行复杂的状态驱动协议
  • 通道,支持对象之间的消息传递
  • 演员,包括打字演员和匿名演员
  • 光纤,协作线程模型
  • 路由
  • 请求/回复
  • 调度器

即将来临:

  • 正确的主管层级

在Chris撰写本文时被积极开发。

概述:

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

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


刚刚在Øredev看到了@phatboyg谈论的事态。非常有前途
svrist

似乎不再积极开发Stact了。
罗尼·欧弗比

13

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

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

它通过将对象包装在处理线程切换的代理中来工作。所有正常的.NET功能(尤其是事件)都得到正确处理,因此您可以编写正常的代码,线程编组将独立发生。

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


您是否愿意花一些时间扩展Stact而不是创建新框架?我非常希望看到您的异步思考更多地渗透到Stact中(我不是它的作者,但我真的很喜欢)。
亨里克2012年

嗯,我很高兴Actors的任何实现都在受到关注,但是我仍然喜欢使用方法调用来实现它。使用Stact和NAct将它们与(巧合的)代码示例进行比较:github.com/phatboyg/Stact/wiki/Samples-Ping-Pongcode.google.com/p/n-act/wiki/PingPong
Alex Davies

1
我更喜欢消息传递语义,因为它是真实的,并且无法通过不明确的消息并发和发送时钟来轻松显示例如间歇性网络故障或原因。现在,如果我要参加一个框架,我将扩展F#MailboxProcessor,它已经非常好用-具有主管和更容易在网络中传递消息。
亨里克

我刚刚创建了EasyActor,其原理类似于NAct。Nact的主要区别在于它支持使用Task <T>从参与者接收的结果,并且基于Castle Core DynamicProxy来拦截方法调用。原始性能测试还表明,在乒乓球测试中,粗略提高了40%的性能。
David Desmaisons,2015年


4

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

Axum(以前称为Maestro)是一种基于领域的并发编程语言,基于Actor模型,由Microsoft开发。它是基于.NET Common Language Runtime的面向对象的语言,使用类似C的语法,这是一种特定于域的语言,旨在开发非常适合于并发的软件应用程序的各个部分。但是它包含足够多的通用构造,因此无需为并发组件的顺序部分切换到通用编程语言(如C#)。


感谢您的回答。Axum似乎很有趣,但是乍一看,我认为ac#选项更适合我的问题。
Borba 2010年

3
不幸的是项目已由MS
CharlesB

@CharlesB TPL DataFlow库有点替代了它,不是吗?
EJoshuaS-恢复莫妮卡

@EJoshuaS我不知道
CharlesB '18



1

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

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


0

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

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

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

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

输出:

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

githubdocs上找到它


0

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


0

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.