ホームページ  >  記事  >  バックエンド開発  >  Go 言語が高い同時実行性をサポートする理由は何ですか?

Go 言語が高い同時実行性をサポートする理由は何ですか?

青灯夜游
青灯夜游オリジナル
2022-12-20 10:31:385785ブラウズ

理由: Go言語は設計時にキーワードレベルからマルチコルーチン開発を実装します。 Go 言語は、同時実行の基礎として CSP 同時実行モデルを実装します。最下位層は並行エンティティとして goroutine を使用します。Goroutine は非常に軽量で、数十万のエンティティを作成できます。エンティティはチャネルを介して匿名メッセージングを継続し、それらを分離します。自動スケジューリングが実装されているため、内部の多くの詳細が保護され、単純な構文キーワードが外部に提供され、同時プログラミングの思考の変革とスレッド管理の複雑さが大幅に簡素化されます。

Go 言語が高い同時実行性をサポートする理由は何ですか?

このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。

Go の伝説

市場には Go について多くの伝説があります。「当然のことながら高い同時実行性をサポートし、その実行速度はC に近い。ネットワーク サービス Nginx に近い…」。他は問題ありませんが、唯一理解するのが難しいのは、「自然に高い同時実行性をサポートする」という点で、特に「自然に」という言葉は、人々に高級感と神秘性を感じさせます。

まず、go で同時操作を実装することがいかに簡単かを見てみましょう。コードを見てみましょう:

func main()  {
   go add(3,6)  
   go add(1,6)  
   time.Sleep(time.Second)}func add(a int,b int)  {
   result := a+b
   fmt.Println(result)}

go キーワードは、コルーチンの開始呼び出しを実装します。待機が実行されない場合は、 、メインスレッドが終了すると、コルーチンはすぐに終了します。

go の同時実行性

実際、go 言語の goroutine は参照 (逐次処理の通信) モデルであり、go 言語のチャネルです。元の CSP タスクはすぐに実行されますが、Go 言語はキャッシュを追加します。つまり、タスクを一時的に保存し、実行プロセスの準備ができたら 1 つずつ順番に実行できます。

しかし実際には、Go 言語は CSP モデルのすべての理論を完全に実装しているわけではなく、プロセスとチャネルの 2 つの概念を借用しているだけです。 Go言語における処理の性能は、ゴルーチンが実際に並行して実行されるエンティティであり、チャネル通信により各エンティティ間でデータ共有が行われます。

1) goroutine

Goroutine は go の実際の同時実行エンティティであり、その最下層はコルーチン (coroutine) を使用して同時実行を実現します。ユーザー スレッドの場合、Go 最下層がコルーチンを使用する出発点は、次の特性があるためです:

  1. ユーザー空間により、カーネル モードとユーザー モードの切り替えによって発生するコストが回避されます。
  2. 言語層とフレームワーク層でのスケジューリングで使用可能
  3. スタック領域が小さいため、多数のインスタンスを作成できます

2) チャネル

CSP の go チャネルで使用されます。チャネルは個別に作成され、プロセス間で受け渡すことができます。その通信モードはボスワーカー モードに似ています。エンティティはチャネルにメッセージを送信し、チャネルのエンティティ処理をリッスンします。2 つのエンティティ間の関係は次のとおりです。匿名、これによりエンティティ間の分離が実現します。チャネルは同期であり、メッセージはチャネルに送信されます。メッセージは最終的には別のエンティティによって消費される必要があります。原則として、実際にはブロッキング メッセージ キューです。

3) スケジューラ

ゴルーチンは、golang レベルでスケジューラを提供します。スチール動作アルゴリズムがスケジューラに追加されます。ゴルーチンは非同期にプリエンプトできるため、関数呼び出しのループによってスケジューラーがデッドロックされたり、ガベージ コレクションが大幅に遅くなったりすることがなくなりました。さらに、Go はネットワーク IO ライブラリをカプセル化し、複雑な詳細を保護し、統一された構文キーワードのサポートを外部に提供し、並行プログラムの作成コストを簡素化します。

概要

Golang は、同時実行の基礎として CSP 同時実行モデルを実装します。最下位層は並行エンティティとして goroutine を使用します。Goroutine は非常に優れています。軽量で、数十万のエンティティを作成できます。チャネルを介したエンティティ間の継続的な匿名メッセージングにより、エンティティ間の結合が分離され、言語レベルでの自動スケジューリングが実現されます。これにより、多くの内部詳細が保護され、単純な構文キーワードが外部に提供され、同時プログラミングの思考変革とスレッド管理の複雑さが大幅に簡素化されます。 。

一文で要約: Go 言語は、あたかも言語が本質的に高い同時実行性をサポートしているかのように、設計中にキーワード レベルからマルチコルーチン開発を実装します。

【関連する推奨事項: Go ビデオ チュートリアル プログラミング教育

以上がGo 言語が高い同時実行性をサポートする理由は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。