コルーチンスケジューリングを行きます

この記事では、単純にコルーチンこの子の話を派遣、コルーチンスケジューリングを達成するために、チャネル、シンクおよびその他の特定の文言によって説明しません。

ノンプリエンプティブスケジューリング

コルーチン行くスケジューリング言語は非プリエンプティブ非プリエンプティブスケジューリング、ありますか?さんが先制しましょう。

私たちは、時間に関係なく、Aが最初に停止されますスレッドを述べるものの、スレッドA Bから糸をつなぎするために必要な各スレッドの道を、スケジュールラウンドロビンを使用して、オペレーティングシステムのスレッドスケジューリングことを知っています。これは、多くの場合、スレッドは半分の時間を行うことをやっている状況をスケジュールします、時間に、次のタイムスライスがそれを回すことを確実にするために、私たちは事をし続けることができ、スレッドレジスタに現在の状態の必要性、そして問題は、この操作のレジスタを維持し、自明であろうが、非常に時間がかかり、これが先制欠点です。

それの非プリエンプティブ行く、誰もが別のコルーチンを実行するためのコルーチンを停止し、力を指していないコルーチンは、CPUを放棄するためのイニシアチブをとるだろうどのように法律を作るには?自然はそう、作るために自由ではない、その目的は、コルーチンは、CPUをできるように一度に一つのことを終了しますので、あなたが何かを保存する必要はありませんので、レジスタにコルーチン状態の山への切り替えに必要性を回避するためであるとき。

コンパイル時間スケジューリング

コルーチン1の事、それを終了するときにどのように知っていますか?ランタイムはこの子を決定する場合は、明らかにプログラムが実行されている場合、そのことを意味するので、外出先言語はコンパイル時に決定された追加のコストを必要とし、どのように計画され、コンパイル時に、コルーチンを切り替えるにはAこれは、利益が生じるからコルーチンを行く達成するための言語レベルです。

スイッチングポイント

ここではいくつかのコルーチンている可能性のハンドオーバを:

  • こうした印刷、プリント仕上げ、仕上げとしてioが、ものとみなすことができます
  • 関数呼び出しは、別の事の子供を行う必要があり、コール機能にあると理解することができますので、この時間は、あなたは切り替えることができます
  • いつもより何かとコルーチンよりも、されている)(runtime.Goschedチャネル、シンク、、、言うことはありません。

上記のいくつかのですが、完成したプリントは確かに別のスレッドに行くに切り替わります常にではありません必ずしも切り替えないかもしれスイッチは、外出先では、実際のコードを切り替えるためのより適切な時間を決定することに注意してください。

これは実際には小さな例、10コルーチンを開いて次のコードを、見ることができますが、実際は11で、私たちは忘れてはならない主なコルーチンがコルーチンされ、それが原因で、メインコルーチンたら、非常に重要ですで終了し、他のコルーチンも殺されるが、なぜ次のプログラムは、我々はあなたがいない睡眠をすれば、タイムスライスが離れてそれを与える主なコルーチン、メインコルーチンを待たない、メインコルーチンの睡眠を一秒を聞かせて10他のコルーチンから直接実行終了チャンスをデビューしません。

package main

import (
	"fmt"
	"time"
)

func main()  {
	for i := 0; i < 10; i++ {
		go func(i int) {
			for {
				fmt.Println(i)
			}
		}(i)
	}
	time.Sleep(time.Second)
}

プログラムをたくさん実行した結果は、我々は唯一の短い標本続く、問題を説明するのに十分です。

あなたは、このの傍受を見ることができた後、コルーチンスイッチがあった、スイッチは3コルーチンの印刷があること、コルーチン切り替えは、印刷に発生し、3つ以上のプリントされた後起こったが、いないすべての印刷が切り替わります。オーバーヘッドスイッチング行くコルーチン切り替えスレッドはより小さいものの、実際には、よく理解したが、すべての後に、オーバーヘッドがあり、我々はまだカットにカットを言うことはできません。

私たちは、書き込みの種類を変更して再試行してください。

package main

import (
	"time"
)

func main()  {
	for i := 0; i < 10; i++ {
		go func(i int) {
			for {
				i++
			}
		}(i)
	}
	time.Sleep(time.Second)
}

このプログラムはまた、10コルーチン、異なる時間開いている、コルーチンそこには印刷されない、または任意の言語コンパイラを行っていないが、点コルーチンスイッチとみなすことができるので、この操作の結果は永遠であり、長いためコルーチンへの一つとしてとして、終了しないだろう、私は++、私は切り替わりませんされていると思います。実際の書き込みコードは、私たちは自然に書き込み、これを回避したいです。

スレッド

最後に、デフォルトの言語は、我々は最終的にそれは少数のスレッドになり、私たちは実際に同時に協会で複数のプロセスを実行するときに、スレッドが複数のコルーチンを持つことができることを知って、スレッドが道を行く話をしたいですか?

答えは、ある複数のスレッドを使用して、CPUは、いくつかの核を持っています私たちは、シングルコアで複数のスレッドを実行することが、複数の同時スレッドが真実ではないですが、CPUのスケジューリングで実行するためには、それを知っています。Goは言語レベルからより多くのコルーチン適切なスケジューリングを行う必要がありますので、外出先では、スレッドのスケジューリングは、無意味です。そのため、プログラム1000件の同時コルーチンがある、唯一の4コアCPU場合、プログラム稼動中は、わずか4つのスレッドまで使用されます。

公開された39元の記事 ウォン称賛25 ビュー120 000 +

おすすめ

転載: blog.csdn.net/u013536232/article/details/104892205