2番目の記事で疑問になっていたところを解消しておこう。
hiro99ma blog: [golang] chan で待つ (2)
https://hiro99ma.blogspot.com/2022/06/golang-chan-2.html
のこちら。
その後で A が終わって待ち解除になると B 待ち状態になるが、既に処理が終わった B についてどうなるのかわからん。
についてだ。
まず、勘違いしていた件。
done := make(chan struct{}, 3)
こう書いたとしても、
done[0] <- struct{}{}
のようには書けないということだ。
make() は capacity を設定するものだから len() ではなく cap() を使って容量を取ってくるのだった。
それを踏まえて。
package main import ( "fmt" "time" ) func main() { fmt.Printf("start\n") done := []chan struct{}{ make(chan struct{}), make(chan struct{}), make(chan struct{}), } go func() { fmt.Printf("goroutine start - 1\n") time.Sleep(10 * time.Second) fmt.Printf("goroutine done - 1\n") done[0] <- struct{}{} fmt.Printf("goroutine sent - 1\n") }() go func() { fmt.Printf("goroutine start - 2\n") time.Sleep(5 * time.Second) fmt.Printf("goroutine done - 2\n") done[1] <- struct{}{} fmt.Printf("goroutine sent - 2\n") }() go func() { fmt.Printf("goroutine start - 3\n") time.Sleep(3 * time.Second) fmt.Printf("goroutine done - 3\n") done[2] <- struct{}{} fmt.Printf("goroutine sent - 3\n") }() fmt.Printf("waiting...\n") <-done[0] fmt.Printf("done - 1\n") <-done[1] fmt.Printf("done - 2\n") <-done[2] fmt.Printf("done - 3\n") fmt.Printf("all done\n") }
実行。
$ go run . start waiting... goroutine start - 3 goroutine start - 1 goroutine start - 2 goroutine done - 3 goroutine done - 2 goroutine done - 1 goroutine sent - 1 done - 1 done - 2 done - 3 goroutine sent - 3 all done
時間の経過が見えないが、「goroutine done - 1」以降は一気に出力されている。
「sent」のログは全部出ていないが、これはその前にプロセスが終了したからだろう。
まあ、これなら前回の最後に書いた for でぐるぐる回して待つ方がシンプルに見えるな。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。