最後の 1 年間、私は Java と flex に取り組んでいました。フレックスをコーディングしている間、私のコード部分のほとんどは、非同期であるため、トスになりました。同期実行言語と非同期実行言語の本当の長所と短所について考えさせられました。
それらが他のものと比較してより強い領域はどこで、それらが落ちる領域は何ですか?
最後の 1 年間、私は Java と flex に取り組んでいました。フレックスをコーディングしている間、私のコード部分のほとんどは、非同期であるため、トスになりました。同期実行言語と非同期実行言語の本当の長所と短所について考えさせられました。
それらが他のものと比較してより強い領域はどこで、それらが落ちる領域は何ですか?
私は昨年のほとんどを Silverlight でのコーディングに費やしました。つまり、あなたが説明しているのと同じ問題を考え抜く (そして戦う) のにかなりの時間を費やしてきたことを意味します。
簡単に言うと、他の人が指摘しているように、非同期モデルの真の強みは、現実世界とうまく相互運用できる堅牢なシステムを作成できることです。Web サービス呼び出しが戻るのに数秒かかるたびに UI スレッドが停止した場合、Silverlight (または Flash) アプリケーションを実際に使用できる人は誰もいません。
最大の欠点は、生成されるコードが複雑でトラブルシューティングが難しいことです。エラー処理のようなものは PITA ですが、私が対処しなければならなかった最も面倒なことは、複数の非同期呼び出しからの応答を調整することです。たとえば、コール B を行う前にコール A からの情報が必要であり、コール C を行う前にコール B からの情報が必要な場合 (など)、結果のコードは非常に不快に見え、あらゆる種類の奇妙な副作用の影響を受けやすくなります。 . これらすべてを機能させるためのテクニックはありますが、かなりきれいにすることさえできますが、同期の世界から来た場合 (私のように)、それはかなりの学習曲線です。(そして、私の意見では、コールバック時に WCF 呼び出しを処理する方法として Microsoft がイベントをプッシュすることは役に立ちません。
(そして、そうです、特定のフレームワークが非同期的な方法でコードを構築することを必要とするほど、非同期的な言語ではないという他の人々の発言は正しいですが、私はあなたの言いたいことを理解しています。)
更新 2014.09.23 -
上記の回答を書いて以来 (おそらく、Web コーディングを行ったことのある他のすべての人がそうであるように)、さまざまな非同期フレームワークでさらに多くの作業を行ってきました。
ファーストクラスの非同期サポートを備えた C# や F# などの言語を使用している場合、少なくとも、奇妙なasync
/await
パターンに頭を悩ませると、これの多くがずっと簡単になります。非同期呼び出しを簡単にループして、全体を単純なtry/catch
, でラップできることは、古い方法で行う必要があった場合に驚くべきことです。
ファーストクラスの非同期サポートを備えた言語を使用していない場合は、その言語が提供するものまたはpromise
サポート(たとえば、JQuery の、または Angular の ) の使用を開始します。これらは、コールバックで通常得られるものよりもはるかにクリーンで、より優れた構造を提供します。 .future
task
$.Deferred()
$q.defer()
非同期コードは、スケーラブルなサーバー側システムを作成するために重要です。一般的な Web サーバーを適切にスケーリングする際の最大の問題の 1 つは、スレッドが不足し始めることです。そのスレッドが停止した場合、実行時間の長い同期呼び出しが終了するのを待っているため、他のことを支援するために完全に利用できなくなります。はるかに優れているのは、Web サーバー コードを非同期にすることです。これにより、DB 呼び出しが返されるのを待っているときに、DB が実行され、DB が行うことを実行している間に、そのスレッドが他の 6 個の要求を処理できるようになります。現時点では、高度にスケーラブルなシステムの場合、非同期は唯一のゲームです。(ノード愛好家に聞いてください。)
(セマンティクス レベルの議論、つまり「同期/非同期言語」はさておき)
「言語」(それが何であれ)に基づいて構築された「フレームワーク」は、有用であるためにそのようなケース(同期/非同期プログラムフロー)を処理できる必要があります(読み取り:$ wise)。
非同期のイディオムは、あらゆる規模で適切です。
大規模な場合、非同期技術は信頼性の高いシステムを構築するのに役立ちます。現実の世界は本質的に非同期であるためです。つまり、失敗、損失、遅延などの現実の状況に対処するには、「非同期思考」で考える必要があります。
規模が小さい場合 (GUI アプリケーションなど) でも、イベント (「マウス クリック」など) は「非同期」になる傾向があります。もちろん、それらはある時点で「シリアル化」されますが (何らかのソフトウェアを実行するアプリケーションで処理できるようにするため)、問題のプログラムのフローに関してイベントが (おそらく) 「非同期的に」発生したという事実は変わりません。 .
言語の問題ではなく、フレームワークの問題だと思います。
適切な反例:
「クラシック Mac」(MacOS 9 以前) アプリケーションを C (存在する場合は「同期」言語) で作成する場合、プリエンプティブ マルチスレッドがないため、ブロックする可能性のあるすべてのシステム コールには非同期の対応するものがあります。コールバック関数を含むパラメーターを持つデータのブロック。次に、システム コールを実行すると (すぐに返されます)、コールバックが非同期的に呼び出されます (「割り込みレベル」と呼ばれるもので)。コールバックが別の非同期システム コールを実行し、メイン スレッドと非同期で実行される長いバックグラウンド スレッドを作成することは珍しくありませんでした。