1
0

More than 3 years have passed since last update.

Go 並行処理

Posted at

ゴルーチンやチャンネルといった並行処理についてまとめます

ゴルーチンとは

  • Goにはゴルーチンという軽量スレッドの仕組みがある。(main()関数も1つのゴルーチンの中で実行されている)
  • go構文を用いて、任意の関数を別ゴルーチンとして起動することで処理を並行にして走らせることができる

チャネル

  • 複数のゴルーチン間でデータをやり取りしたい場合に用いる
  • メッセージパッシング(情報をメッセージとして送受信する)によってデータを送受信することができる
  • make()関数に型を指定して生成することで、その型のデータの書き込みと読み出しができる。
main.go
// stringを扱うチャネルを生成
ch := make(chan string)
// チャネルにstringを書き込む
ch <- "a"
// チャネルからstringを読み出す
message := <- ch

ゴルーチン内で取得したステータスコードをチャネルに書き込み、main()のゴルーチンで読み出すことでデータの受け渡しを実現する

main.go
package main
import "fmt"

func main() {
  urls := []string {
    "https://example.com",
    "https://example.jp",
    "https://example.net",
  }
  statusChan := make(chan string)
  for _, url := range urls {
    go func(url string) {
      res, err := http.Get(url)
      if err != nil {
        log.Fatal(err)
      }
      defer res.Body.Close()
      statusChan <-res.Status
    }(url)
  }
  for i := 0; i < len(urls); i++ {
    fmt.Println(<-status)
  }
}
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0