問題タブ [orleans]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
actor - アクター モデル フレームワークと複合イベント処理 (CEP) の違いは何ですか?
Actor Model Framework ( Orleansなど) と Complex Event Processing (CEP) ( Apache Stormなど)の違いは何ですか?
これらのアプローチのそれぞれが適用可能な (または、一方が他方よりも適用可能である) 使用例は確かに役立ちます。
nservicebus - NServiceBus Sagas に似たオーリンズ グレイン?
Orleans を使用して Halo 4 の分散型クラウド サービスを構築する方法のビデオを見たところです。
c# - グレイン インターフェイスの実装クラスの型コードが見つかりません
Microsoft orleans (v0.9 プレビュー 2014 年 4 月)では、orleans グレインを参照する Azure Web API を作成するときに、次のエラーが発生する場合があります。
グレイン インターフェイスの実装クラスの型コードが見つかりません: 729000394.
グレイン アセンブリが正しく展開され、サイロに読み込まれたことを確認してください。
このエラーを生成する可能性があるサンプル API コードを次に示します。
ここにいくつかの穀物コードがあります:
c# - スケジューラに関して async-await C# コードを F# に変換する
これは大まかな質問ではないかと思いますが、最近、C# から適切な F# に変換する方法を確認したいコードに出くわしました。旅はここ (1) (TPL-F# の相互作用に関する元の問題) から始まり、ここ(2) (F# に変換することを検討しているサンプル コード)から続きます。
サンプル コードは長すぎてここで再現できませんが、興味深い関数はActivateAsync
、RefreshHubs
およびAddHub
です。特に興味深い点は、
AddHub
の署名がありprivate async Task AddHub(string address)
ます。RefreshHubs
はループ内で を呼び出しAddHub
、 のリストを収集しますtasks
。これは最後に によって待機し、await Task.WhenAll(tasks)
その結果、戻り値は の署名と一致しますprivate async Task RefreshHubs(object _)
。RefreshHubs
ActivateAsync
asによって呼び出され、最後に関数 signature に一致await RefreshHubs(null)
する呼び出しがあります。await base.ActivateAsync()
public override async Task ActivateAsync()
質問:
インターフェイスと機能を維持し、既定のカスタム スケジューラを尊重する F# へのそのような関数シグネチャの正しい変換は何でしょうか? それ以外の点では、この「F# での async/await」についても確信が持てません。「機械的に」それを行う方法のように。:)
その理由は、リンク「here (1)」に問題があるように見えるためです (私はこれを確認していません)。F# 非同期操作は、(Orleans) ランタイムによって設定されたカスタムの協調スケジューラを尊重しません。また、ここでは、TPL 操作はスケジューラをエスケープしてタスク プールに移動するため、その使用は禁止されていると述べられています。
これに対処する方法の 1 つは、次のように F# 関数を使用することです。
このstartAsPlainTask
関数は、ここからSacha Barberによるものです。別の興味深いオプションは次のとおりです。
<編集:Task.WhenAll
も待機する必要があることに気付きました。しかし、適切な方法は何でしょうか?ええと、寝る時間です (悪い駄洒落)...
<編集 2:ここ (1) (TPL-F# の相互作用に関する元の問題)では、Codeplex で、F# は同期コンテキストを使用して作業をスレッドにプッシュするが、TPL はそうではないことが言及されています。さて、これはもっともらしい説明だと思います (ただし、カスタム スケジューラに関係なく、これらのスニペットを適切に翻訳するにはまだ問題があります)。いくつかの興味深い追加情報がから得られる可能性があります
- SynchronizationContext を使用するタスクを取得するには? とにかく SynchronizationContext はどのように使用されますか?
- Await、SynchronizationContext、およびコンソール アプリで、
SingleThreadSynchronizationContext
実行される作業をキューに入れるように見える例が提供されています。これは使うべきなのではないでしょうか?
この文脈では、興味深い接線としてHopacに言及する必要があると思います。
<編集 3 : Danielとsvickは、カスタム タスク ビルダーを使用するようコメントで適切なアドバイスを提供しています。Daniel は、すでにFSharpxで定義されているものへのリンクを提供しています。
ソースを見ると、パラメーターを持つインターフェイスが次のように定義されていることがわかります
オルレアンでこれを使用する場合は、ここのドキュメントTaskScheduler
に従っている必要があるようですTaskScheduler.Current
Orleans には独自のタスク スケジューラがあり、グレイン内で使用されるシングル スレッド実行モデルを提供します。タスクを実行するときは、.NET スレッド プールではなく、Orleans スケジューラを使用することが重要です。
グレイン コードでサブタスクを作成する必要がある場合は、Task.Factory.StartNew を使用する必要があります。
await Task.Factory.StartNew(() =>{ /* ロジック */ });
この手法では、現在のタスク スケジューラ (Orleans スケジューラ) を使用します。
常に .NET スレッド プールを使用する Task.Run の使用は避ける必要があるため、シングル スレッド実行モデルでは実行されません。
TaskScheduler.CurrentとTaskScheduler.Defaultの間に微妙な違いがあるようです。たぶん、これは、どの例のケースで望ましくない違いがあるかについての質問を正当化します. Orleansのドキュメントでは使用しないように指摘されておりTask.Run
、代わりに. . うーん、私が間違っていなければそうなるようです。Task.Factory.StartNew
.Default
.DenyAttachChilld
また、カスタム スケジューラに関してはTask.Run
vizに問題があるため、タスク スケジューラ (Task.Factory) で説明されているようにカスタムTaskFactoryを使用し、スレッドの数を制御することで、この特定の問題を解決できないかと考えています。同時実行を制限するタスク スケジューラ。Task.Factory.CreateNew
うーん、これはすでにかなり長い「熟考」になっています。どうやってこれを閉じればいいのだろうか?たぶん、svickとDanielがコメントを回答として作成でき、私が両方に賛成してsvickのを受け入れるとしたら?
azure - VSO Hosted Build Controller でビルド時に環境変数を設定するにはどうすればよいですか?
ビルド時に VSO Hosted Build Controller で環境変数を設定するにはどうすればよいですか? 理想的なソリューションは、MSBuild 引数を使用することです。
シナリオ(知る必要はありません) : Orleans ベースの Azure Hosted Cloud Service を取得して、VSO Hosted Build Controller を使用してビルドおよびデプロイしようとしています。現在、TFS を使用して独自のビルド コントローラーをホストしていますが、VSO でホストされているビルド コントローラーを使用したいと考えています。これを機能させるには、ビルド時に Orleans 環境変数を VSO Hosted Build Controller 上のプロジェクト内のパスに設定する必要があります。継続的な展開モデルを使用しています。
f# - パラメーターを取る関数で FSharpx TaskBuilder を使用する方法
私は最近、FSharpx ライブラリ、特にそのTaskBuilderを使ってプログラミングしています。ここで、パラメーターと結果を受け取る関数を定義することが可能であるべきかどうか疑問に思います。そのような
runのソースコードを見ると、パラメータをとらずに を返す関数が必要Task<'a>
です。FSharpx TaskTestsにも例があるようには見えません。
FSharpx を使用してこのようなシナリオを実現するにはどうすればよいか、またはまだよく理解していない理由でこのようなライブラリを使用することを想定していない場合に、誰かがアドバイスしてくれれば幸いです。
<編集: doTask を次のようにラップできると思います
そして、それはうまくいくかもしれません。私は現在コンパイラを使用していないので、これはちょっと手が込んでいます。誰かが方向性について意見を持っていますか、それとも私は自分の質問に答えただけですか? :)
<edit2: MisterMetaphor の回答
に基づいて、これをもう一度編集する必要があると思います。特に彼のは、よく情報を提供しP.S.
ていたと思います。私は FSharpx TaskBuilder を使用して C# と相互運用します。C# では、前述のように、タスクは(いくつかの小さな例外を除いて)ホットとして返され、既に実行されています。これは、私の最近の質問Translating async-await C# code to F# with the scheduler and in related Orleansに関連しています (コンテキストを強化するためにいくつかのタグを追加します。他の誰かがこれらについても熟考している可能性があります)。
C# の用語で考えると、私が達成しようとしているのは、タスクの結果を待ってから戻ることですが、ブロックすることはありません。私が求めている動作は、特にawait
notの動作です.Result
。違いは、たとえば次のように読み取ることができます。
C# に関して、どのコンテキスト、スケジューラ、動作、または何かが起こっているかを考えようとするのは、私にとってはやや曖昧です。残念ながら、相互運用に関しては、すべての詳細を無視できないようです。:)
c# - サブスクライブで Task.Factory.StartNew(async () => {}) を呼び出すのは一般的に疑わしいですか?
タスクを実行するためにカスタム スケジューラを使用する必要があり (これらはタスクである必要があります)、スケジューラが同期コンテキストを設定しない (つまり、収集しない、など)ObserveOn
状況があります。以下は、私がそれをやった方法です。さて、これが非同期呼び出しを実行してその結果を待つのに最適な方法であるかどうかは、よくわかりません。これで大丈夫ですか、それともより堅牢または慣用的な方法がありますか?SubscribeOn
SynchronizationContextScheduler
待っている必要がない場合はどうなりますか?
<編集:私がここでやっていることの具体的で単純化された例を見つけました。基本的に、私は Orleans で Rx を使用しています。上記のコードは、私がやっていることの必要最小限の図です。私は一般的にこの状況にも興味がありますが。
最終的なコード
Orleans のコンテキストでは、これは少しトリッキーであることがわかりました。を使用する方法がわかりませんObserveOn
。これは、私が使いたいものです。問題は、それを使用すると、Subscribe
が呼び出されないことです。コード:
また、 Codeplex Orleans フォーラムの関連スレッドへのリンク。