go基本文法学習ノートの同時プログラミング

2876 ワード

GO同時


関数呼び出しの前にgoキーを付けると、新しいgoroutineで同時に実行されます.
func Add(x, y int) {
     z := x + y
     fmt.Println(z)
}
func main() {
    for i := 0; i < 10; i++ {
            go Add(i, i)
    }
}

Goプログラムはmain packageを初期化するmain()関数を実行することから始まり、main()関数が戻るとプログラムは終了する.そしてプログラムは待たない
その他goroutine(メインgoroutine以外)は終了します.

同時通信


GO言語は、同時プログラミングを言語の最も核心的な利点とし、共有メモリではなくメッセージメカニズムを通信方式とする通信モデルを提供する.
メッセージ・メカニズムは、各コンカレント・ユニットが自己包含的で独立した個体であり、独自の変数があると考えられるが、異なるコンカレント・ユニット間ではこれらの変数は共有されない.各コンカレントユニットの入出力は、メッセージである1つだけです.
これはプロセスの概念に似ています.各プロセスは他のプロセスに邪魔されず、自分の仕事だけをすればいいです.異なるプロセス間ではメッセージによって通信され、メモリは共有されません.
Go言語が提供するメッセージ通信メカニズムをchannelと呼ぶ
「共有メモリで通信するのではなく、通信でメモリを共有する必要があります.」

channel


channelは、Go言語が言語レベルで提供するgoroutine間の通信方式である.チャンネルはタイプに関係しています
chan宣言
var chanName chan ElementType
次のようになります.
var chint chan int  // int chan

var mch  map[string] chan bool  // map, bool

var arrch [10]chan int // 

≪インスタンス|Instance|emdw≫
func Count(ch chan int) {
     ch 

チャンネルの定義
内蔵関数make()を直接使用します.
    ch := make(chan int)

channelの基本的な使い方
書き込み
	ch < 1

チャネルにデータを書き込むと、通常、他のgoroutineがこのチャネルからデータを読み出すまでプログラムがブロックされます.
リードアウト
   i := < ch

chにデータがない場合は、chにデータが書き込まれるまでプログラムがブロックされます.
しかし,chのブロックに対しては,chのバッファメカニズムやselectを利用して柔軟に出ることができる.
バッファメカニズム
バッファ付きchannelは、大量のデータを連続的に転送するシーンに適しており、makeの2番目のパラメータに容量を転送するだけでバッファ付きchannelを定義します.
   c := make(chan int, 1024)  // 1024 chan,   

チャンネルは伝達可能
たんほうこうチャネル
一方向channelは、データの送信または受信にのみ使用できます.
宣言
var ch1 chan int // ch1 channel, 
var ch2 chan

初期化
チャンネルは
一方向チャネルと双方向チャネルの間で変換すると、チャネル自体がGOの原生タイプであるため、伝達されてもよいし、タイプ変換されてもよい
ch4 := make(chan int)
ch5 := 

チャンネルを閉じる
直接closeでいいです
close(ch)

チャンネルが閉じたかどうかを判断するには、複数の値で読み取りを返すことができ、2番目のbool戻り値がfalseであればchが閉じたことを示す
x, ok := 

select


一連のファイルハンドルで発生したIO操作を監視するために使用され、そのうちの1つのハンドルでIO操作が発生すると、返される
GO言語レベルでselectをサポート
コード構造は次のようになります.
select {
	case 	//  chan1 , case 
	case chan2 	//  chan2 , case 
	default:
	//  , default 
}

各caseはファイルハンドル操作でなければなりません
forと組み合わせてサイクル検出を実現
ch := make(chan int, 1)
for {
	select {
		case ch 		case ch 	}
	i := 	fmt.Println("Value received:", i)
}