Golangのスレッドとコルーチンの違いは何ですか

青灯夜游
リリース: 2021-03-18 17:23:55
オリジナル
3226 人が閲覧しました

違い: スレッド内のデータはカーネル モード メモリ空間に格納されますが、コルーチン内のデータはスレッドによって提供されるユーザー モード メモリ空間に格納されます。スレッドのタスク スケジューリングはカーネルによって実装され、プリエンプション メソッドはさまざまなロックに依存します。コルーチンのタスク スケジューリングは、ユーザー モードで実装された特定のスケジューラによって実装されます。

Golangのスレッドとコルーチンの違いは何ですか

このチュートリアルの動作環境: Windows10 システム、GO 1.11.2、thinkpad t480 コンピューター。

Coroutine
コルーチン、英語名は Coroutine です。ただし、Go 言語では、コルーチンの英語名は gorutine です。マルチタスク、つまり同時ジョブによく使用されます。そうです、それはマルチスレッドのジョブです。

Go では、同時実行を実行するためにスレッドなどのコードを直接記述する必要はありませんが、Go のコルーチンはスレッドに依存します。

それぞれの違いを見てみましょう。

スレッドの基本的な紹介。スレッドに関する優れた紹介記事がたくさんあるため、ここでオンライン記事を検索してください。

コルーチンの特徴
ここでは、まずスレッドの特徴を直接列挙し、サンプルから分析していきます。

  • 複数のコルーチンは 1 つ以上のスレッドで管理できます。コルーチンのスケジューリングは、コルーチンが配置されているスレッドで行われます。

  • はスケジュール可能です。

    スケジュール戦略はアプリケーション層のコードによって定義され、高度にカスタマイズできます。

  • #高い実行効率。
  • 使用するメモリが少なくなります。
上記の

12 のポイント

我们来看一个例子:
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()}
ログイン後にコピー
上記のコード スニペットは実行後に実行されました2 つのコルーチンでは、観測される出力の

順序がずらされます。

656612367
ログイン後にコピー
は、コルーチン A の実行中に、いつでも中断してコルーチン B を実行できることを意味します。

コルーチン B は、実行プロセス中に中断されることもあります。 A.

コルーチン A とコルーチン B の実行はスレッド切り替えに似ているように見えますが、ここでの A と B は 両方とも同じスレッド で実行されていることに注意してください。それらのスケジューリングはスレッド切り替えではなく、
純粋なアプリケーション状態のコルーチン スケジューリングです。 上記のコードに関して、次の 2 行のコードを指定する必要があるのはなぜですか?

runtime.GOMAXPROCS(1)time.Sleep(time.Second)
ログイン後にコピー
これには、Go のコルーチン スケジューリングの基本を確認する必要があります。以前のスケジューリング分析の記事をお読みください:
Go のコルーチン スケジューリング メカニズム

そうでない場合は、 runtime.GOMAXPROCS を設定してください。 (1) の場合、プログラムはオペレーティング システムの CPU コアの数に応じて対応する数の P を起動し、その結果、複数の M、つまりスレッドが起動します。次に、プログラム内のコルーチンが別のスレッドに割り当てられます。デモンストレーションの目的で、数値が 1 に設定されているため、これらはすべて同じスレッドに割り当てられ、スレッドのコルーチン キューに格納され、実行またはスケジュールされるのを待機します。

コルーチン特性の

3

および 4 ポイント。 3. 高い実行効率。 4. 占有メモリはほとんどありません。
コルーチンのスケジューリング切り替えはスレッド切り替えではなく
、プログラム自体によって制御されるため、

スレッド切り替えのオーバーヘッドはありません

マルチスレッドでは、スレッドの数が増えるほど、コルーチンのパフォーマンス上の利点がより明らかになります。スケジューリングは、カーネル モードではなくアプリケーション モードで行われます。 メモリ コストは、スレッドが配置されているスレッドのメモリを使用することです。つまり、スレッドのメモリは複数のコルーチンによって使用される可能性があります。 第二に、コルーチンの

スケジューリングには、マルチスレッド ロック メカニズムが必要ありません。

これは、スレッドが 1 つだけであり、

変数の同時書き込みによる競合がないためです。

なので、マルチスレッドよりも実行効率が高くなります。 コルーチンとスレッドの全体的な比較

比較ポイントスレッドデータ ストレージカーネル状態メモリ スペース操作は最終的にカーネル層で完了します。アプリケーション層は、カーネル層によって提供される syscall の基礎となる関数を呼び出す必要があります。カーネル、プリエンプション モードによって実装され、さまざまなロックに依存しますほとんどのプログラミング言語最新のオペレーティング システム仕様に従った実装 推奨学習: Golang チュートリアル
コルーチン
通常、スレッドによって提供されるユーザー状態メモリ スペースです 切り替え操作
アプリケーションレイヤーはコードを使用して簡単なオンサイト操作を実行します 保存して復元するだけです タスク スケジューリング
続行するには、ユーザー モード デバイスによって実装される特定のスケジューリングが必要です。たとえば、go コルーチン スケジューラー 音声サポート
一部の言語: Lua、Go、Python... 実装仕様
統一された仕様はありません。これは開発者によってアプリケーション層で実装され、高度にカスタマイズされており、たとえば、シングルスレッドのみをサポートします。さまざまなスケジュール戦略など。

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

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート