非同期プログラミングモデル(パート1)

まず、問題に対処します。つまり、なぜ非同期モデルが必要なのか、同期モデルには適さないのか、ということです。



同期モデルは、入出力(ネットワーク、ファイルシステムなど、さらにI / O)の結果を見越してストリームをブロックします。したがって、他のことを行うには、別のストリームが必要です。 したがって、このモデルのボトルネックはスレッドとスレッドのコンテキストの切り替えであり、これは非常にリソースを消費する操作です。

理想的には、システムにプロセッサ(コア)と同数のワーカースレッドが存在することがシステムに不可欠です。



非同期モデルを使用すると、I / O操作中にフローを続行し、操作が完了すると通知を受け取ることができます。 このようにして、スレッドはI / Oの進行中に有用な作業を行うことができます。



さて、これでそれが何であるかがわかったので、非同期モデルを最も効果的なものとして使用することにしましたが、それを扱うほど、落とし穴に遭遇します。



非同期モデルの難しさは、理解可能な、論理的に一貫したコードの作成、エラー処理の構造メカニズムにあります(try / catchを忘れることができます)。 その結果、キャッチしにくいバグが多数あります。



これに対処する方法は? プラットフォームとプログラミング言語に依存する概念を述べようとします。



1).NET-私の意見では、最も簡単でエレガントな方法は、Microsoft .NETチームによって実装できます。 つまり、.NETの論理フローにファイバーを使用します。 ファイバーはコードを実行できる軽量のオブジェクトであり、ファイバー間の切り替えはリソースを消費しません。 システムスレッドの数の制御とファイバーの切り替えは、.NETランタイムによって実行する必要があります。 あなた自身でこれを実現することは困難です。 .NETランタイムでの論理スレッドの操作は文書化されていません。

その結果、プログラマーは同期モデルを使用し、何も考えない、つまり フローをブロックする代わりに、ファイバーは別のタスクを実行するように変更されます。



2)C#.NET-メカニズム、非同期モデルも同期モデルの利点を持つパターンを実装します-論理的にシーケンシャルなコード、構造エラー処理メカニズム。 コード例を使用したこのアプローチについては、次のパートで説明します。



3)C ++ / Windows-このアプローチは、段落1で実際に説明されています。 非同期モデルのサポートを実装するには、ファイバーを使用する必要があります。



簡単に説明すると、明確で役立つことを願っています。

これはHabrに関する私の最初の記事であり、厳密に判断するものではありません;)



All Articles