「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
概要 †
非同期処理の実装方式について。
詳細 †
非同期処理の定義 †
- 一般的に、非同期処理と言うと、
同期処理(オンライン)との対比になり、
同期処理(オンライン)オンラインとの待ち合わせをする。
- 同期処理(オンライン)と待ち合わせをしない場合は、
同期処理(オンライン)から、
- 別途スレッドを生成し、そのワーカースレッドで処理させたり、
- キューにキューイングして、バッチで処理させたり、
することになるが、対比するものが無いため非同期か?と言うと、
単なるバッチ処理やマルチスレッド処理、若しくは並列処理と言った方がイイかも知れない。
非同期処理の実装史 †
1. Thread、ThreadPool? †
- 概要
- 従来の(プリミティブな)、マルチスレッド・プログラミング。
- 詳細
- スレッドの並列実行はOSが裏で無意識にしてくれていた。
- タイムスライスで細切れ/ラウンドロビンで論理的に並列実行。
- CPUのコア数に応じて、物理的に並列実行。
- しかし、以下の処理は意識的に実装する必要があった。
- 非同期処理をスレッド関数として分離して実装する。
- スレッド関数を作成したワーカースレッドに渡す。
- (必要に応じて)ワーカースレッドの結果をメインスレッドで待ち合わせる。
2. APM (Beginメソッド, Endメソッド) †
- 概要
- 「前述のThread、ThreadPool」から非同期を意識したAPIを設計に変更した程度。
- 代表的なメソッド
- Streamクラスの、BeginRead? および EndRead? メソッド
- WebRequest?クラスの、BeginGetResponse? および EndGetResponse? メソッド
- 詳細
- Beginメソッドに Endメソッドのdelegate(≒callback)を渡す。
- 同期方法はクラスの実装に依る。
4. Future/Promise †
- 詳細
- 非同期のcallbackを、delegateを引数に取るmethod chainに、匿名delegateで実装していく感じ。
- このコーディング・スタイルにより、あまりcallbackっぽく見えない同期に近いコーディングが可能。
- しかし、非同期処理の結果から、また非同期を呼び出すようなコードは上手く書けない。
- 参考
- 言語によってちょっと違うFuture/Promiseをまとめてみた
- 概要
- async/awaitで、同期呼び出し的に非同期処理を記述可能になった。
- 斬新な仕組みのため、無批判で浸透したが、昨今、振り返りフェーズにある気がする。
- 詳細
- 「状態変化を検知して非同期イベントを発火」のようなライブラリなので、
業務系にはミスマッチと思われる。ゲーム業界などでは使われている模様。
- 最近の、非同期呼出というコンテキスト上では、async/awaitが優勢である模様。
参考 †
SlideShare? †
Tags: :プログラミング, :その他、開発の色々, :.NET開発