Closed17

go言語による並行処理

hayaohayao

Rust好きの自分ですら、並行処理関係はGoの方が書きやすい感じ始めている。
ということでGoでも並行処理を勉強する。

hayaohayao

並行処理を扱うための道具

多くの言語

OSスレッドとメモリアクセス同期

Go

ゴルーチンとチャネル

hayaohayao

ゴルーチンは呼び出し元とメモリ空間を共有する。

hayaohayao

WaitGroup

ひとまとまりの並行処理があったときに、その結果を気にしない。もしくは他に結果を取得する手段があるときに使う。どちらにも当てはまない場合はselectを使う

hayaohayao

Cond

なにかが発生するまで待機したいときに使う

hayaohayao

チャネル

受信専用

var dataCh := <-chan interface{}

送信専用

var dataCh := chan<- interface{}
hayaohayao

goのチャネルはブロックする

rangeキーワード

チャネルを引数にとり、チャネルが閉じた時に自動でループを終了する。

hayaohayao
hayaohayao

チャネルを正しく使うコツ

チャネルの所有権を割り振る。

所有権とはチャネルを初期化し、書き込み、閉じるゴルーチンと定義

hayaohayao

select

select {
 case <- ch1:
    // なにかする。
 case <- ch2:
    // なにかする。
 case ch3<-struct{}{}:
    // なにかする。
}

caseにはチャネルへの読み書きが書かれる。
どれかが用意できたら、その読み書き操作が実行され、対応する文が実行される。
どれも準備できていなかったらブロックされる。

一様乱数で選択される。

default節

hayaohayao

Goによる並行処理中級者への道

ゴルーチン、チャネル、select、syncパッケージに入っているものを、スケールしつつ理解しやすい構造に組み合わせていく方法を身につける

hayaohayao

for-selectループ

for {
 select {
 }
}

利用されるシナリオ

  • チャネルから繰り返し変数を相州する。
  • 停止シグナルをもつ無限ループ
hayaohayao

ゴルーチンリークを避ける

doneチャネルを使う。

hayaohayao

orチャネル

doneチャネルを束ねたいときの設計パターン
再帰とゴルーチンを用いる。

hayaohayao

エラーハンドリング

ゴルーチンの中で発生したエラーをどう扱うか?
エラーと所望する値をもつResult構造体みたいなものをチャネルに詰める。

hayaohayao

パイプライン

ストリーミング処理をチャネルで実現できる。

hayaohayao

contextパッケージ

doneチャネルの強化版
Contextはインターフェース
withXXXでcontextを受け取って、機能を付加したcontextを生成できる。

このスクラップは2022/05/29にクローズされました