違い: スレッド内のデータはカーネル モード メモリ空間に格納されますが、コルーチン内のデータはスレッドによって提供されるユーザー モード メモリ空間に格納されます。スレッドのタスク スケジューリングはカーネルによって実装され、プリエンプション メソッドはさまざまなロックに依存します。コルーチンのタスク スケジューリングは、ユーザー モードで実装された特定のスケジューラによって実装されます。
このチュートリアルの動作環境: Windows10 システム、GO 1.11.2、thinkpad t480 コンピューター。
Coroutine
コルーチン、英語名は Coroutine です。ただし、Go 言語では、コルーチンの英語名は gorutine です。マルチタスク、つまり同時ジョブによく使用されます。そうです、それはマルチスレッドのジョブです。
Go では、同時実行を実行するためにスレッドなどのコードを直接記述する必要はありませんが、Go のコルーチンはスレッドに依存します。
それぞれの違いを見てみましょう。
スレッドの基本的な紹介。スレッドに関する優れた紹介記事がたくさんあるため、ここでオンライン記事を検索してください。
コルーチンの特徴
ここでは、まずスレッドの特徴を直接列挙し、サンプルから分析していきます。
複数のコルーチンは 1 つ以上のスレッドで管理できます。コルーチンのスケジューリングは、コルーチンが配置されているスレッドで行われます。
スケジュール戦略はアプリケーション層のコードによって定義され、高度にカスタマイズできます。
1 と 2 のポイント我们来看一个例子:
func TestGorutine(t *testing.T) {
runtime.GOMAXPROCS(1) // 指定最大 P 为 1,从而管理协程最多的线程为 1 个
wg := sync.WaitGroup{} // 控制等待所有协程都执行完再退出程序
wg.Add(2)
// 运行一个协程
go func() {
fmt.Println(1)
fmt.Println(2)
fmt.Println(3)
wg.Done()
}()
// 运行第二个协程
go func() {
fmt.Println(65)
fmt.Println(66)
// 设置个睡眠,让该协程执行超时而被挂起,引起超时调度
time.Sleep(time.Second)
fmt.Println(67)
wg.Done()
}()
wg.Wait()}
656612367
コルーチン A とコルーチン B の実行はスレッド切り替えに似ているように見えますが、ここでの A と B は 両方とも同じスレッド で実行されていることに注意してください。それらのスケジューリングはスレッド切り替えではなく、
純粋なアプリケーション状態のコルーチン スケジューリングです。 上記のコードに関して、次の 2 行のコードを指定する必要があるのはなぜですか? runtime.GOMAXPROCS(1)time.Sleep(time.Second)
Go のコルーチン スケジューリング メカニズム
そうでない場合は、 runtime.GOMAXPROCS を設定してください。 (1) の場合、プログラムはオペレーティング システムの CPU コアの数に応じて対応する数の P を起動し、その結果、複数の M、つまりスレッドが起動します。次に、プログラム内のコルーチンが別のスレッドに割り当てられます。デモンストレーションの目的で、数値が 1 に設定されているため、これらはすべて同じスレッドに割り当てられ、スレッドのコルーチン キューに格納され、実行またはスケジュールされるのを待機します。
コルーチン特性の
3 および 4 ポイント。 3. 高い実行効率。 4. 占有メモリはほとんどありません。
コルーチンのスケジューリング切り替えはスレッド切り替えではなく
、プログラム自体によって制御されるため、
マルチスレッドでは、スレッドの数が増えるほど、コルーチンのパフォーマンス上の利点がより明らかになります。スケジューリングは、カーネル モードではなくアプリケーション モードで行われます。 メモリ コストは、スレッドが配置されているスレッドのメモリを使用することです。つまり、スレッドのメモリは複数のコルーチンによって使用される可能性があります。 第二に、コルーチンの
スケジューリングには、マルチスレッド ロック メカニズムが必要ありません。これは、スレッドが 1 つだけであり、
変数の同時書き込みによる競合がないためです。なので、マルチスレッドよりも実行効率が高くなります。 コルーチンとスレッドの全体的な比較
比較ポイント
コルーチン | ||
---|---|---|
通常、スレッドによって提供されるユーザー状態メモリ スペースです | 切り替え操作 | |
アプリケーションレイヤーはコードを使用して簡単なオンサイト操作を実行します 保存して復元するだけです | タスク スケジューリング | |
続行するには、ユーザー モード デバイスによって実装される特定のスケジューリングが必要です。たとえば、go コルーチン スケジューラー | 音声サポート | |
一部の言語: Lua、Go、Python... | 実装仕様 | |
統一された仕様はありません。これは開発者によってアプリケーション層で実装され、高度にカスタマイズされており、たとえば、シングルスレッドのみをサポートします。さまざまなスケジュール戦略など。 | 推奨学習: |
以上がGolangのスレッドとコルーチンの違いは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。