web-dev-qa-db-ja.com

C#のアクターの適切な実装はありますか?

.net/c#の actors concurrency model の適切な実装はありますか?

C#ルーチンを最適化する必要があり、アクターモデルは私の問題の解決策として完全に適合すると思います。残念ながら、私はscalaの実装でしか経験がありません。

71
Borba

MS 同時実行および調整ランタイム(CCR) 、および 分散ソフトウェアサービス(DSS)Robotic Studio の一部をご覧ください。

これらのフレームワークを使用すると、アクターとアプローチのほとんどの要件を満たす疎結合サービスを開発できます。

Axumが最適です。残念ながら、まだアルファ/ベータ段階の段階です(2011年2月に削除されました)。私はそれを研究に使用し、一般的な方向性は素晴らしいものであり、大きな可能性があると言わなければなりません。

C#ではなく、C++はMicrosoftの 非同期エージェントライブラリ であり、必要なすべての機能を提供します。

パラレル関連機能 .NET 4をよく見てください。

それが役に立てば幸い!

22
alex25

.NETアクターモデルフレームワーク:

原型・俳優

  • 俳優
  • バーチャルアクター

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

Akka.NET

  • 俳優

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

マイクロソフトオーリンズ

  • バーチャルアクター

https://github.com/dotnet/orleans

51
Roger Johansson

俳優に対するProject OrleansのMicrosoftのアプローチも見るかもしれません(先週リリースされました)。

これはプロジェクトのWebサイトです。 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

24
silverfighter

スタクト

.Net上のアクターライブラリ。非常に有能で十分にテストされています。 TopShelf、MassTransit、およびNServiceBus.Hostの基盤。

https://github.com/phatboyg/stact

抽象化が含まれます:

  • ワークフロー。複雑な状態駆動型プロトコルを定義して実行できます
  • オブジェクト間のメッセージの受け渡しをサポートするチャネル
  • タイプされた匿名のアクター
  • ファイバー、協調スレッドモデル
  • ルーティング
  • リクエスト/リプライ
  • スケジューラー

今後:

  • 適切な監督者階層

執筆時点でクリスが積極的に開発している。

概要:

並行アプリケーションの開発には、現在のソフトウェア開発方法とは異なるアプローチが必要です。これは、自律システムコンポーネント間の並行性と通信を重視するアプローチです。アクターモデルは、(オブジェクト指向設計のインターフェイスでメソッドを呼び出すのではなく)メッセージを交換することにより相互に対話するアクターと呼ばれるソフトウェアコンポーネントのシステムを定義し、データが(制御の代わりに)コンポーネントを介して流れるシステムを生成しますシステムの機能要件。

Stactは、.NETのアクターモデルを使用してアプリケーションを構築するためのライブラリです。メインアセンブリであるStact.dllはアクターライブラリであり、あらゆるタイプのアプリケーションでアクターモデルを使用するために必要なすべてが含まれています。また、Stact.ServerFrameworkなどの追加のサポートフレームワークがあり、これを使用してソケットまたはHTTP経由でアクターを公開し、アクターを使用してサービスを構築できます。

18
Henrik

NAct は、本当に使いやすいアプローチをとる.NETのアクターフレームワークです。 (免責事項:私はそれを書きました)

2つのアクター間で渡されるメッセージは、2つのオブジェクト間のメソッド呼び出しにすぎません。すべてのメソッド引数が不変であり、スレッドセーフであることを確認する必要があります。

スレッドの切り替えを処理するプロキシでオブジェクトをラップすることで機能します。すべての通常の.NET機能、特にイベントは正しく処理されるため、通常のコードを記述することができ、スレッドマーシャリングはそれ自体で行われます。

C#5 async/awaitをサポートするブランチもあります。

13
Alex Davies

本日、マイクロソフトは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 [〜#〜] が利用可能になり、 ビデオチュートリアル もあります。

5
hasancc

C#の実装については知りませんが、MicrosoftのActorモデルに基づいたまったく新しいプログラミング言語があります。 Axum :と呼ばれます。

Axum(以前のコード名はMaestro)は、Microsoftによって開発された、Actorモデルに基づくドメイン固有の並行プログラミング言語です。これは、ドメイン固有の言語であるCライクな構文を使用した.NET共通言語ランタイムに基づくオブジェクト指向言語であり、並行性に適したソフトウェアアプリケーションの一部の開発を目的としています。ただし、これには十分な汎用構造が含まれているため、コンカレントコンポーネントのシーケンシャル部分を汎用プログラミング言語(C#など)に切り替える必要はありません。

4
Anton Gogolev

PostSharp Actors も考慮する必要があります

2
Omer Raviv

F#で提供されるTのMailboxProcessorを検討しましたか?

2
GregC

Remact.Net は現在のプロジェクトです。リモートアクターメッセージングにWebSocketsとJsonを使用します。 C#アクターの型安全性を備えていますが、Javaスクリプトで記述されたブラウザーベースのアクターの動的型もサポートしています。

以前のプロジェクトは AsyncWcfLib でした。これは、プロセス内または異なるアプリケーション間で通信するアクター用のC#ライブラリです。リモートメッセージパッシングはWCFを使用します。
アクターカタログサービスにより、複数のホストでアクターを検出できます。ホストはWindowsまたはLinuxを実行できます。

1
Stefan Forster

既に述べたように、F#のMailboxProcessorクラスは、アクターモデルのシンプルで簡単な実装を提供します。使い方の素晴らしい紹介が利用可能です こちら 。 F#はC#と非常によく相互運用でき、さまざまなメッセージを投稿するメソッドを使用してクラス内のエージェントをラップできます。エージェントが非同期応答で応答する場合については、 PostAndAsyncReply メソッドを参照してください。これは、 Async.StartAsTask メソッドを使用してC#で待機できるタスクに変換できる非同期ワークフローを返します。

最後に、アクターをリモートで配布する必要がある場合は、C#APIとF#APIの両方を提供する Akka.NET を確認することをお勧めします。

0
Anton Tcholakov

この質問に気づき、新しいデータポイントを追加することを考えました。現在、Microsoftには ActorFX と呼ばれるこのための半公式プロジェクトがあります。オープンソースであり、まだ進化していますが、注目する価値があります...

0
Justin du Coeur

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」アクターに2つのメッセージを送信すると、

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

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

出力:

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

github および docs にあります

0
Henrik