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