ホームページ >よくある問題 >Golangのコルーチンとは何ですか

Golangのコルーチンとは何ですか

小老鼠
小老鼠オリジナル
2023-06-20 16:16:421051ブラウズ

Golang のコルーチンは goroutine です。違いは、Golang がランタイムやシステム コールなどの多くの側面で goroutine のスケジューリングをカプセル化し、処理することです。長時間の実行やシステム コールが発生した場合、アクティブに CPU が実行されます。現在のゴルーチンは転送され、他のゴルーチンをスケジュールして実行できるようになります。Golang は言語レベルからコルーチンをネイティブにサポートしています。関数またはメソッドの前に go キーワードを追加することでコルーチンを作成できます。

Golangのコルーチンとは何ですか

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

コルーチン (ユーザーレベルのスレッド) の場合、これはカーネルに対して透過的です。つまり、システムはコルーチンの存在を認識せず、ロバ自体のプログラムによって完全にスケジュールされます。プログラム自体を制御する場合、プリエンプティブスケジューリングのように他のプロセス/スレッドにCPU制御を強制的に切り替えることは困難であり、通常は協調スケジューリングのみが可能であるため、コルーチンは他のコルーチンを制御する前に能動的に制御権を移譲する必要がある。

ゴルーチンとコルーチンの違い

本質的に、ゴルーチンはコルーチンです。違いは、Golang はランタイムやシステム コールなどの多くの側面でゴルーチンのスケジューリングをカプセル化して処理することです。長時間の実行やシステム コールが発生すると、現在のゴルーチンの CPU (P) を他のゴルーチンに積極的に転送します。つまり、Golang は言語レベルでコルーチンをサポートします。 Golang の大きな特徴は、言語レベルでコルーチンをネイティブにサポートしていることであり、関数またはメソッドの前に go キーワードを追加することでコルーチンを作成できます。

他の側面での比較

1. メモリ消費量

各 go-routine (コルーチン) は、デフォルトで Java や C スレッドよりもはるかに少ないメモリを占有します。

ゴールーチン。2KB。

スレッド: 8MB。

2. スレッドと go-routine 間の切り替えのスケジューリング オーバーヘッドの点で

#スレッドと go-routine の切り替えのオーバーヘッドという点では、go-routine はスレッドよりもはるかに小さいです。

スレッド: モード切り替え (ユーザー モードからカーネル モードへの切り替え)、16 個のレジスタ、PC、SP..、その他のレジスタのリフレッシュなどが含まれます。

go-routine: PC/SP/DX の 3 つのレジスタ値のみが変更されます。

2. コルーチンの基本的な実装原理

スレッドはオペレーティング システムのカーネル オブジェクトです。マルチスレッド プログラミング中にスレッドが多すぎると、頻繁にコンテキスト スイッチが発生します。これらの CPU時間は追加費用となります。したがって、一部の高度に同時実行されるネットワーク サーバー プログラミングでは、1 つのソケット接続に 1 つのスレッドを使用するのは賢明ではありません。したがって、オペレーティング システムは、イベント パターンに基づいた非同期プログラミング モデルを提供します。少数のスレッドを使用して、多数のネットワーク接続と /0 操作を処理します。ただし、非同期およびイベントベースのプログラミング モデルを使用すると、プログラム コードの作成が複雑になり、エラーが非常に発生しやすくなります。スレッドがインターリーブされるため、エラーのトラブルシューティングも難しくなります。

コルーチンはアプリケーション層でシミュレートされるスレッドであり、コンテキスト切り替えの余分なコストを回避し、マルチスレッドの利点を考慮しています。同時実行性の高いプログラムの複雑さを簡素化します。たとえば、同時実行性の高いネットワーク サーバーでは、各ソケットが接続され、サーバーはコルーチンを使用してサービスを提供します。コードは非常に明確です。そしてパフォーマンスも考慮されます。

以上がGolangのコルーチンとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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