2011-09-20 8 views
17

実行時にruntime.GOMAXPROCS(1)を呼び出すと、ランタイムはすべてのゴルーチンに1つのスレッドしか使用しません。 ioを実行すると、goroutinesが生成され、他のgoroutineが同じスレッドで実行されます。.net Asyncとgoogleの主な違いは何ですか?

これは、バックグラウンドスレッドを使用していない場合、.net Async CTP機能が協調的並行処理を実行する方法と非常によく似ています。

私の質問は、あなたが他の方法よりも優れていると思われる方法です。

答えて

23

価値判断をすることは常に難しいことなので、3つの違いを強調します。それらが「プロ」バケツか「コン」バケットに分類されるかを決定します。

  1. 行くと非同期あなたは簡単な方法で非同期コードを書くことができ、両方が、.NETであなたは注意する必要があり、あなたのコードの一部は非同期で、どちらがない(つまり、明示的に持っていますasync /キーワードを待つ)。 Goでは、実行時に「うまくいく」、非同期コードをマークする特別な構文がないことを知る必要はありません。

  2. Goデザインでは、標準ライブラリに特別なコードは必要ありません。 .NETでは、非同期操作ごとに標準ライブラリに新しいコードを追加する必要がありました。新しい非同期httpダウンロードAPIがあり、古い非同期httpダウンロードAPIは下位互換性のために残さなければなりません。

  3. 設計と実装は、より簡単になります。小さなランタイムコード(スケジューラ)は、システムコールをブロックして眠っているゴルーチンに降ろすゴルーチンを一時停止させます。標準ライブラリに特別な非同期サポートは必要ありません。

最初に、前述の新しいAPIを追加する必要がありました。さらに、.NETの実装は、コンパイラが非同期/同等の状態マシンを待つコードを書き換えることに基づいています。それは非常に巧妙ですが、やや複雑です。実際の結果は、最初の非同期CTPはバグを認識していたが、Goの実装は最初からかなり機能していた。

最終的には、実際問題ではありません。 async/awaitは、.NETに非同期コードを書き込むための最良の方法です。ゴルーチンはGoでそれを得るための最善の方法です。どちらも他のほとんどの言語の選択肢に比べて優れています。

+0

本当にありがとうございました。私は、2つの言語の中から選択する必要があるものの、実行速度のパフォーマンスの面でもっと考えていました。 – skyde

+10

私は同意できないと思います。スレッドごとのプロセス(チャネルは単純に同期キュー)を使用して、C#およびJavaでgo-styleゴルーチンを記述できます。多くの場合、GoゴルーチンではいくつかのOSスレッドに多重化されているという事実は気にしません。 C#asyncは、特定のコードが同じOSスレッドで実行されることを約束しています。これはUIスレッドの場合に非常に適しています。あなたはそのような約束を行くことはできません。 –

+0

Goでシミュレートする方法の例がありますか?私が知る限り、そのようなものはありません。 – Kugel

関連する問題