Goならわかるシステムプログラミング:第4章 チャネル

執筆日:

更新日:

こんにちは、もーすけです。
「Goならわかるシステムプログラミング」を読み進めています。とてもいい本です。 読み進めながら実験していることを書いていきます。同じ本を読んでいる人の参考(寄り道?)になればと思います。 今回は「低レベルアクセスへの入り口3:チャネル」です。


Goならわかるシステムプログラミングの学習シリーズ

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")
}
記事の内容に関連した相談、仕事依頼したい New

記事の内容やクラウドネイティブ技術に関する相談、仕事依頼を開始しました。
仕事依頼、相談をしてみる

フィードバック

本記事に対して、フィードバックあればこちらのフォームからご記入ください。
記事の内容にフィードバックしてみる

このエントリーをはてなブックマークに追加