BT

TPL Dataflow – CCRの後継者

| 作者: Jonathan Allen フォローする 553 人のフォロワー , 翻訳者 尾崎 義尚 フォローする 0 人のフォロワー 投稿日 2011年1月16日. 推定読書時間: 3 分 |

原文(投稿日:2011/01/06)へのリンク

TPL Dataflowは、高度な同時実行アプリケーションのためのマイクロソフトの新しいライブラリである。非同期メッセージのパッシングやパイプラインを使用して、スレッドプール以上のコントロールとマニュアルスレッディング以上のパフォーマンスを約束している。欠点は、.NETプログラマにはなじみが薄いであろうデザインパターンを厳守しなくてはならないことである。

Dataflowは、「ブロック」の組み合わせで構成されている。それぞれのブロックは、CCRのポートとして知られ、データのソースまたはターゲットとすることができる。データは通常、ISourceBlock<T>とITargetBlock<T>の両方を実装したプロパゲーションブロックによってポストされて、データフローにエントリする。このブロックがソースの場合、おそらく他のターゲットかプロパゲーションブロックにリンクされている。データフローは、あるブロックから次へ非同期で処理され、ときどきソースまたはターゲットでそれが必要になるまで待機する。

名前が示すように、TPL Dataflowは、.NET 4のTask Parallel Libraryを基盤にしている。そして、TPLのようにカスタム実装することによりデフォルトスケジューラを置き換えることができる。初期状態では、.NETのスレッドプールシステムがベースとなっているものとsynchronization contextフレームワークがある。後者は、データフローをGUIの操作に使うときなど、データフローを特定のスレッド上で実行したい場合に使用する。ドキュメントでは、この点がクリアに書かれていないが、ブロック間のスケジューラでセットして表示することができる。もしこれが事実なら、これはGUIスレッドとの間でデータをやりとりするためのすばらしい仕組みを提供することになる。

デフォルトでデータフローは、公正さよりパフォーマンスに調整されている。あるブロックがアクティブになると、実行が終わるまでプロセスのデータが継続される。あるブロックがすべての有効なリソースを消費するのを避けるため、メッセージの数を制限することができる。セットされると、ブロックは終了前に現在のタスクと他のタスクに引き継げるようにデータを処理する。

ブロックは、無尽蔵に、もしくは節約してデータを消費する。後者は、いくつかのソースから複数のターゲットにメッセージを送るときに非常に重要になる。たとえば、複数のターゲットをロードバランスすることで、それらのターゲットが確実に節約されるようになり、最初の無尽蔵ブロックにすべてを消費されることを避けることができる。他の理由として、節約するブロックは、より新しいバージョンで置き換えたときに、メッセージがドロップされる。この例は、ブロードキャストブロックである。それぞれのメッセージは、そのターゲットに送られる。ターゲットがブロックを受け付けなかった場合、次回ブロードキャストブロックがメッセージを受け取るまで残りを利用することができる。

ロックの問題については、TPL Dataflowは、デッドロックを回避するために興味深い設計をしている。複数のソースからの入力でブロックが必要になったとき、すべてのソースのデータが有効になるまで待つ。そのポイントでは、、それが実際にそれぞれのソースから取得したデータであることを保証するために2フェーズコミットを使う。このメカニズムを信頼して、ワークフローの内部でのマニュアルロックを行わないことが強く推奨されている。

このデザインは、特に競合条件に結合することができるブロードキャストのようなブロックと結合するのに適している。実際にはあるメッセージが配信され、複数のブロックに作用する時に問題がある。ロックはスケジューラでインターフェイスできるので、メッセージを不変データ型で使う方がはるかに安全である。

TPL Dataflow libraryは、Async CTPとともに公開されている。

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

あなたの意見をお聞かせください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする
コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

ディスカッション

InfoQにログインし新機能を利用する


パスワードを忘れた方はこちらへ

Follow

お気に入りのトピックや著者をフォローする

業界やサイト内で一番重要な見出しを閲覧する

Like

より多いシグナル、より少ないノイズ

お気に入りのトピックと著者を選択して自分のフィードを作る

Notifications

最新情報をすぐ手に入れるようにしよう

通知設定をして、お気に入りコンテンツを見逃さないようにしよう!

BT