本章では,
並行プログラミングの基本
複数の処理を効率良く行うために,
本節では,
ゴルーチン
Goには,main()
関数も,
ここではHTTPへのアクセス処理を用いて,
ゴルーチンを使わない場合
たとえば,
package main
import (
"fmt"
"log"
"net/http"
)
func main() {
urls := []string{
"http://example.com",
"http://example.net",
"http://example.org",
}
for _, url := range urls {
res, err := http.Get(url)
if err != nil {
log.Fatal(err)
}
defer res.Body.Close()
fmt.Println(url, res.Status)
}
}
http.
は同期処理であるため,
しかし,
ゴルーチンを使った場合
先ほどのプログラムを,
func main() {
urls := []string{
"http://example.com",
"http://example.net",
"http://example.org",
}
for _, url := range urls {
// 取得処理をゴルーチンで実行する
go func(url string) {
res, err := http.Get(url)
if err != nil {
log.Fatal(err)
}
defer res.Body.Close()
fmt.Println(url, res.Status)
}(url)
}
// main()が終わらないように待ち合わせる
time.Sleep(time.Second)
}
ここではmain()
が実行されたときに内部で3つのゴルーチンを起動していますが,main()
は先に進んでしまうため,time.
を呼んで1秒間main()
を止めています
このプログラムの実行は図2のようなイメージです。各ゴルーチンが並行してリクエストを発行しているため,