語学学習ノート9に行く-Goroutine
コルーチンコルーチン
- 軽量の「スレッド」
- 非プリエンプティブマルチタスク、コルーチンは積極的に制御を引き渡します
- コンパイラ/インタプリタ/VMレベルでのマルチタスク
- 複数のコルーチンが1つ以上のスレッドで実行される場合があります
I / O操作自体には待機プロセスがあり、コルーチンを切り替えます
。Goはゴルーチンを確立し、次の機能を同時に実行します。メインプログラムは引き続き実行され、
メイン自体もゴルーチンです。
func main() {
var a [10]int
fmt.Println(a)
for i := 0; i < 10; i++ {
go func(i int) {
for {
a[i]++
runtime.Gosched()//手动交出控制权
}
}(i)
}
time.Sleep(time.Millisecond)
fmt.Println(a)
}
コルーチン
サブルーチンは、
他の言語のコルーチンコルーチンの特殊なケースです
- C ++:Boost.Coroutine
- Java:サポートされていません
- python:yieldキーワードはコルーチンを実装し、python3.5はコルーチンのネイティブサポートに非同期定義を追加します
Goのコルーチン
- goを追加するだけで、任意の関数をスケジューラーに送信して実行できます
- 定義時に非同期関数かどうかを区別する必要はありません
- スケジューラーは適切なポイントで切り替わります
- 可能なスイッチングポイント
- I / O、選択
- チャネル
- ロックを待っています
- 関数呼び出し(時々)
- runtime.Gosched()
- 参考までに、切り替えの保証はなく、他の場所に切り替えないという保証もありません
- -raceを使用して、データアクセス違反を検出します