77

.net/c#的演员并发模型有什么好的实现吗?

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

4

13 回答 13

57

.NET Actor 模型框架:

原型演员

  • 演员
  • 虚拟演员

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

阿卡网

  • 演员

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

微软奥尔良

  • 虚拟演员

https://github.com/dotnet/orleans

于 2014-01-02T14:39:28.697 回答
25

也可以看看 Project Orleans Microsofts 对演员的处理方法。(上周发布)

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

这里也是来自 build 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

于 2014-04-11T13:34:21.020 回答
22

你应该看看 MS Concurrency & Coordination Runtime (CCR)Decentralized Software Services (DSS),它是Robotic Studio的一部分。

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

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

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

好好看看.NET 4 的Parallel 相关特性

希望能帮助到你!

于 2010-02-20T01:19:13.047 回答
18

稳定

.Net 上的演员库。相当称职且经过良好测试。TopShelf、MassTransit 和 NServiceBus.Host 的基础。

https://github.com/phatboyg/stact

包含抽象:

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

即将到来:

  • 适当的主管层次结构

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

概述:

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

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

于 2011-10-06T14:51:36.320 回答
13

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

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

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

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

于 2012-03-03T22:16:28.323 回答
5

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

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

于 2010-02-02T17:36:35.387 回答
5

今天微软发布了Azure Service Fabric,根据这张图,它实现了一个actor编程模型:

Azure 服务结构

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

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

于 2015-04-20T16:47:17.700 回答
2

您是否考虑过 F# 提供的 T 的 MailboxProcessor?

于 2011-04-07T13:12:39.777 回答
2

您还应该考虑PostSharp Actors

于 2013-02-09T09:12:09.840 回答
1

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

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

于 2012-11-28T22:16:52.013 回答
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上找到它

于 2013-06-17T09:10:06.370 回答
0

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

于 2013-10-30T13:21:31.610 回答
0

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

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

于 2015-01-22T08:18:29.303 回答