こんにちは、もーすけです。
「Goならわかるシステムプログラミング」を読み進めています。とてもいい本です。
読み進めながら実験していることを書いていきます。同じ本を読んでいる人の参考(寄り道?)になればと思います。
今回は「低レベルアクセスへの入り口3:チャネル」です。
Amazonで渋川よしき, ごっちんのGoならわかるシステムプログラミング 第2版。アマゾンならポイント還元本が多数。渋川よしき, ごっちん作品ほか、お急ぎ便対象商品は当日お届けも可能。またGoならわかるシステムプログラミング 第2版もアマゾン配送商品なら通常配送無料。
www.amazon.co.jp
Goならわかるシステムプログラミングの学習シリーズ
- 第2章 io.Writer
- 第3章 io.Reader
- 第4章 チャネル
- 第5章 システムコール
- 第6章 TCPソケットとHTTPの実装
- Coming soon
goroutine と チャネル
本章では、goroutineとチャネルについて学びました。
あまり慣れない概念なので試して遊びます。fooとbarのworkerを用意し、それぞれ1秒/3秒ごとにチャネルへ文字列を書き込みます。逐一その書き込んだ情報を出力する例です。
package main
import (
"fmt"
"time"
)
func main() {
foo := make(chan string)
bar := make(chan string)
go worker("foo", foo, 1)
go worker("bar", bar, 3)
for {
select {
case msgFoo := <-foo:
fmt.Println(msgFoo)
case msgBar := <-bar:
fmt.Println(msgBar)
default:
fmt.Println("-----")
time.Sleep(300 * time.Millisecond)
}
}
}
func worker(name string, c chan string, size int) {
for i := 1; true; i += 1 {
c <- fmt.Sprint(name, " worker ", i)
time.Sleep(time.Duration(size) * time.Second)
}
}
問題への挑戦
本章は、問題に挑戦した結果だけまとめます。
Q4.1 タイマー
実装だけみるひ非常にシンプルですが、この感覚になれるのには時間がかかりそうです。
time.After()
は返り値に、チャネルを返してきます。10秒後にチャネルへ値を入れますが、チャネルにデータが入るまで処理はブロックされるので、結果的に10秒間待つことになります。
もちろん、その間に他の処理を行いたい場合は、goroutineでタイマーを実装するといいですかね。
package main
import (
"fmt"
"time"
)
func main() {
<-time.After(10 * time.Second)
fmt.Println("timed out")
}