Goキーワード--go


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()