ホームページ  >  記事  >  バックエンド開発  >  golang のコルーチンについて話しましょう

golang のコルーチンについて話しましょう

藏色散人
藏色散人転載
2021-06-16 14:57:442547ブラウズ

次のチュートリアル コラムでは、golang のコルーチンについて紹介し、説明します。それが必要な友人の役に立てば幸いです。

コルーチンはアプリケーション層のスレッドです。

golang のコルーチンについて話しましょうアプリケーション層は、カーネル層に対するオペレーティング システムの概念であり、CPU の動作レベルに対応します。オペレーティング システムのコア コードはリング 0 レベルで実行され、アプリケーション コードはリング 3 レベルで実行されます。カーネル層とアプリケーション層の間のレベル設定により、一部の高特権操作はカーネル コードによってのみ実行できるようになります。これらの機能を使用するには、アプリケーションはオペレーティング システムの API (Linux ではシステム コールと呼ばれます) を呼び出してカーネル コードを呼び出す必要があります。この呼び出しにより、CPU はリング 3 からリング 0 にコンテキストを切り替えます。この切り替えにより、CPU 時間がいくらか消費されます。

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

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

それでは、コルーチンはどのように実装されるのでしょうか?

原理はスレッドと同じで、スレッド a がスレッド b に切り替わるとき、スレッド a の関連する実行進行状況をスタックにプッシュしてから、スレッド b の実行進行状況をスタックにプッシュする必要があります。スタックからポップアウトする必要があるため、b の実行シーケンスを入力します。コルーチンはこれを達成するために適用されるだけです。 ただし、コルーチンはオペレーティング システムによってスケジュールされず、アプリケーションには CPU スケジューリングを実行する機能や権限がありません。この問題をどうやって解決すればいいでしょうか?

答えは、コルーチンはスレッドベースであるということです。内部実装に関しては、一連のデータ構造と n 個のスレッドが維持されます。実際の実行は依然としてスレッドです。コルーチンによって実行されるコードは実行されるキューにスローされ、これらの n 個のスレッドはキューから引き出されます。実行。これにより、コルーチン実行の問題が解決されます。では、コルーチンはどのように切り替わるのでしょうか?答えは次のとおりです: golang はさまざまな io 関数をカプセル化します。これらのカプセル化された関数はアプリケーションに提供され、オペレーティング システムの非同期 io 関数を内部で呼び出します。これらの非同期関数がビジーまたはブロッキングを返すと、golang はこの機会を利用して既存の実行シーケンスがプッシュされます。これにより、スレッドが別のコルーチンのコードを取得して実行できるようになり、オペレーティング システムの非同期関数を使用してカプセル化することが基本原理となります。 Linux の epoll、select、Windows の iocp、event などが含まれます。

golang はコンパイラと言語ベース ライブラリの複数のレベルからコルーチンを実装するため、golang のコルーチンは、コルーチンの概念を持つさまざまな言語の中で最も完全で成熟した実装です。

10 万個のコルーチンを同時に実行してもプレッシャーはありません。重要なのは、このようなコードは書かないということです。しかし、全体として、プログラマーは Golang コードを作成する際に、ビジネス ロジックの実装により集中することができ、これらの主要な基本コンポーネントに費やすエネルギーを減らすことができます。

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

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。