Goキーワード--go
2698 ワード
go
簡単に高同時を開くことができて、ずっとgolang言語が誇る機能点です.golangはgoroutineによって高同時を実現し、goroutineを開く鍵はgoキーワードである.同時実行を有効にする構文形式は、次のとおりです.
go funcName()
関数を呼び出すと、呼び出された関数の前にgoキーを付けるだけで、同時実行を簡単に開くことができます.次に、サンプルコードを参照してください.
package main
import (
"fmt"
"time"
)
// goroutine1 ,
func goroutine1() {
var idx = 0
for {
idx++
fmt.Println("goroutine 1, ", idx, " ")
// 1
time.Sleep(time.Second * 1)
}
}
// goroutine2 ,
func goroutine2() {
var idx = 0
for {
idx++
fmt.Println("goroutine 2, ", idx, " ")
// 1
time.Sleep(time.Second * 1)
}
}
func main() {
fmt.Println("main function")
//
go goroutine1()
go goroutine2()
// goroutine , ,goroutine
for {
}
}
出力情報:
goroutine 1, 1
goroutine 2, 1
goroutine 2, 2
goroutine 1, 2
goroutine 1, 3
goroutine 2, 3
......
上記のサンプルコードでは、呼び出し時にgoキーを使用して同時実行を開始するgoroutine 1とgoroutine 2の2つの関数が定義されています.同時実行をオンにすると、goroutine 1とgoroutine 2はスケジューラによって実行がスケジュールされ、誰が先に実行し、誰が後で実行するかについては、タスクの優先度が同じであれば、2つのタスクはランダムに実行され、明確な優先順位はありません.
同時実行
シングルコアプロセッサ時代は、ミクロ的には、瞬時にプロセッサに1つの命令しか実行されず、各プロセスは命令のセットであるため、プロセッサは瞬時に1つのプロセスしか実行できません.仮に、現在、ネット有名店があり、多くのお客様が並んでネット有名製品を購入し、1位のお客様が製品を購入することができます.この店には20種類の非常に売れている製品がありますが、社長は1人につき1つの製品しか購入できないことを規定しています.他の製品を購入したい場合は、並び直さなければなりません.そのため、1つの時点では、1人のお客様が製品を購入しているだけで、このプロセスの速度を1億倍にすれば、プロセッサはネットショップのオーナーで、並んでいるお客様が任務です.各タスクが完了するかどうかは、お客様がいくつかの製品を購入したいかによって異なります.タスクの同時実行はこのようなプロセスです.
並列実行
また、上記の顧客がネット上の赤い製品を購入した例では、社長が顧客の列に並ぶ時間が長すぎると、顧客が流失し、店の販売状況に影響を与えるのではないかと心配している場合、社長は新しい従業員を募集し、列に並ぶ窓口を8つに拡大した.この8つのキューの間には互いに干渉がない.顧客の選択方位が広くなり、8つの列が並ぶことができ、以前の1つのウィンドウが並ぶことに比べて、今製品を購入する速度が向上し、再びこのプロセスの速度を1億倍に向上させ、ボスは依然としてプロセッサであり、1つのサービスウィンドウはコアであり、これは8コアプロセッサであり、もし今8人の顧客が並ぶしかなければ、1人1つのサービスウィンドウを占有することができる.8人の顧客が互いに影響を及ぼさないのが、マルチコアプロセッサ時代に並行して実行された概念だ.
CPUコア数の設定
golangのgoroutineはデフォルトではシングルコアで実行する、マルチコア実行を開く方法はruntimeパッケージのGOMAXPROCS関数を使用してコア数を設定する.
runtime.GOMAXPROCS(8)
デフォルト値を8に設定すると、デフォルトで8つのCPUコアがオンになっていることを示しますが、この書き方は明らかにデッドラインすぎて、万が一32コアプロセッサになったら、8コアをオンにするのは無駄ではありません.プロセッサのコアをプログラムで取得する方法は、次のとおりです.
var num = runtime.NumCPU()
num変数はCPUコア数を保存します.
goroutineでどうやって終了しますか?
goroutineで実行を終了する方法は、次の関数呼び出しを実行します.
runtime.Goexit()
タイムスライス
goroutineで運転条件がまだ整っていないことに気づいたら、待ってから実行したらどうしますか?タイムスライス関数を使用して、現在のgoroutineのcpuの占有量を呼び出します.呼び出し関数は次のとおりです.
runtime.Gosched()
クエリ実行中とキュー内のgoroutine
下の関数クエリーを呼び出します.
var runningNum = runtime.NumGoroutine()