問題タブ [tpl-dataflow]
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.
.net - TPL Dataflow(TDF) と Reactive Extensions の違いは何ですか?
何日もグーグルで検索した後、どれがどのシナリオに適しているか判断できないと思います。もちろん、両方を組み合わせた完璧なフレームワークを使用したいと思います(もちろん非現実的です)。併用できることも分かっています。しかし、真の問題は、それぞれのコア設計要素が何であり、他のものとのエミュレートを不可能にするのかということです. これらは私が見つけたものです:
- RX には仮想時間があるため、スケジューラはネットワーク全体を効果的に制御しますが、TDF ではこれは不可能です。これは、すべてのブロックが異なるタスクを使用し、それらが独立して実行されるためです。
- TDFでは、ブロックはメッセージの受信/再送信などを再試行できますが、RXでは不可能です。
- rx ではデータフローはシリアル化されますが、TDF ではこれはオプションです
リストのようなものではなく、構造上の違いだけを話す共通の抽象クラス/カテゴリから両方を派生させようとする理解が得られるとよいでしょう。
c# - 単一のスレッドベースのタスクから複数の IO ベースのタスクからデータを収集する
TPL を使用して、複数の IO ソース (「スレッドレス」タスク) から結果を収集し、ソースごとにスレッド ベースのタスクを生成して監視することなく、それぞれのソースからの結果をシーケンスにマージするにはどうすればよいですか? 1 つのスレッドからソースをポーリングしても安全でしょうか?
そのようなものはどうですか?
.net - 4 つのブロックを非同期的にパイプライン処理するための TPL データフロー設計
TPL Dataflow ProducerConsumer パターンに関する新しい質問で、Svick によって既に回答されています。
- 2 GB の 4 つのファイルを並行して処理する必要があり、ファイル コンテンツ バッファーをバッファーごとに読み取る必要があります。(ここではプロデューサー パターンを使用します。Maxdegreeofparallelism = 4 で、一度に 4 つのバッファーを投稿できます)
- バッファを処理し、中間テーブルに書き込む必要があります。(ここではコンシューマー パターンを使用します。)
- インメモリ データ テーブルは、ビジネス ルールに従って変換され、正規化されたテーブルに書き込まれます。
- メモリ内データは、データの最終バージョンの検証のために再利用されます。
現在、3段目と4段目はブロックを使用していません。消費者からの順次関数呼び出しを介して。
- このデザインは正しいですか?
- 4 つのブロックを 1 つずつパイプライン処理し、プロデューサーとコンシューマーのアプローチを使用する以外に、それらすべてを並列に処理する方法はありますか? このための小さなサンプル コードを教えてください。
c# - ダウンストリームのTPLDataflowブロックは、ソースによって生成されたデータをどのように取得できますか?
TPLデータフローを使用して画像を処理しています。処理要求を受け取り、ストリームから画像を読み取り、いくつかの変換を適用してから、結果の画像を別のストリームに書き込みます。
そのために私はブロックを使用します:
問題は、イニシャルRequest
には、結果を作成するために必要なデータStream
と、その時点で必要な追加情報が含まれていることです。次のように、元のRequest
(または他のコンテキストオブジェクト)をwriterBlock
他のすべてのブロックに渡して渡す必要がありますか?
(これは醜いです)、または最初のブロックを最後のブロックにリンクする(または、一般化して、追加のデータを必要とするブロックにリンクする)方法はありますか?
.net - TPL データ フロー スレッド ローカル データ
DataFlowExecutionOptions で MaxDegreeOfParallelization を > 1 に指定すると、アクションを実行する各タスクが独自のスレッド ローカル データを持つように、スレッド ローカル データを ActionBlock に渡す良い方法はありますか?
これは、おそらく私がやりたいことを明確にする私のコードの一部です:
ActionBlock が、私が提供するスレッド ローカルの init 関数を呼び出せるようにしたいと考えています。このようなもの:
そして、スレッド ローカル データを Action 関数に渡します。
c# - Dataflow のネストされたブロック
TPL データフローの他のブロック内でブロックを呼び出すことはできますか? したがって、4 つのチャネル (R、G、B、A) を含むイメージ レイヤーを処理している場合、ProcessLayer ブロックは 4 つすべてを ProcessChannel ブロックにフィードし、処理が完了したら出力に対して何かを行います。これはコーシャですか、それともブロックを分割して ProcessLayer が 4 つのチャネルを出力するようにする必要がありますか?
コンテキスト: カスタム パーサーを使用して PSD イメージ ファイルを処理しています。これは、レイヤー -> チャネルのグラフです。同期的に、各レイヤーと各チャネルを反復処理します。上記の PSD のサイズは 500 MB 以上になる場合があり、これには永遠に時間がかかるため、TPL Dataflow を試すことにしました。
c# - TransformManyBlock、空の IEnumerables を返すことは、それらをメモリに保持しないように明示的に処理する必要がありますか?
を実装しましたが、ブロック内でTransformManyBlock<Tin,Tout>
空を返すと、その空はシステムのどこにでも保持されるのでしょうか、それともガベージコレクションまたは破棄されるのでしょうか? 代わりに a を使用した場合、明らかに自分でそのような処理を行う必要がありますが、これが のライブラリによって既に処理されているかどうかは疑問です。IEnumerable
IEnumerable
IEnumerable
TransformBlock
TransformManyBlock
私が知りたいのは、TPL がその空の IEnumerable の破棄を処理するのか、それとも自分で処理する必要があるのかということです。
c# - 実行時にTransfromBlockの1つのFuncを別のFuncに「ホットスワップ」できますか?
私は次の設定をしていますTransformBlock
:
実行時にfunc1をfunc2に交換できるかどうか、およびこのtransformBlockと他のデータブロック間のすべてのリンクがそのまま残るかどうか疑問に思います。理想的には、Funcsを交換するときに、新しい変換をすべての新しく入ってくるアイテムに適用したいだけです。明らかに、この単純なアプローチでは、現在キューにあるアイテムとそれらの処理方法については想定していません。新しいFuncを割り当てると、ランタイムエラーが発生するのか、それともtransformBlockのリンクが解除されるのか疑問に思います。いくつかの洞察を共有できる人はいますか?
編集:Jonの提案を投稿し、ここにいくつかの非常に基本的なテストコードをコーディングします。私が興味を持っているのは、volatile
キーワードがある場合とない場合で機能することです。なぜ必要なのvolatile
ですか?
編集(述語スワッピングを含めるため):
.net - タスクの実行に失敗する
大きなテキスト ファイルを読み取り、検索語を含む行を検索するための小さなユーティリティを作成しました。これを TPL Dataflow を学ぶ機会として利用しています。
検索用語がファイルの最後近くにない限り、コードは正常に機能します。その場合、ブレークポイントが存在しない限りuiResult
、アクション ブロックは呼び出されません。
私の理解では、データは from に投稿されuiResult
、searcher
その後完了searcher
します (データの最後のブロックを処理しました)。データはポストされているためuiResult
、そのデータが処理されるまで完全にはなりません。
質問
uiResult
データがポストされているのに完了になるのはなぜですか(でブレークポイントが設定されていない場合uiResult
)。
コード
可能な限り切り詰めた関連コードを次に示します。
c# - TPL Dataflow ローカル ストレージなど
私が達成しようとしているのは、でアクションブロックを持っていることですMaxDegreeOfParallelism = 4
。並列パスごとにセッション オブジェクトのローカル インスタンスを 1 つ作成したいので、合計 4 つのセッション オブジェクトが必要です。これがスレッドの場合、次のようなものを作成します。
ブロックはスレッドではないことを知っているので、同様のものを探していますが、ブロック用です。これを作成する方法はありますか?
このブロックはサービス中であり、何ヶ月も継続して実行されます。その間、ブロックの同時スロットごとに大量のスレッドが使用されるため、スレッド ローカル ストレージは適切ではありません。論理ブロック スロットに関連付けられたものが必要です。また、このブロックは決して完了せず、サービスの存続期間全体を実行します。
注:上記の提案された回答は、私が求めているものには無効です。私は具体的にスレッドローカルとは異なるものを求めており、上記の答えはスレッドローカルを使用しています。これはまったく別の質問です。