Go言語まだまだ勉強中です。
ご指摘いただけると嬉しいです。
やりたいこと
- 無限ループ処理を複数goroutineで立ち上げて動かしたい
- 死んだ処理を再帰的に立ち上げたい
mastodonのstreaming-apiでnotificationsを監視する処理を、
インスタンス(アカウント)の数だけ立ち上げるということをやって見て
goroutine理解度の低さから、そもそも無限ループしないなどハマってしまったので動作コードをアップしました。
簡易版動作コード
3つの無限ループgoroutineを立ち上げて一定時間ごとにprintlnする。
落ちた処理は再度立ち上げる。
テスト用に一定確率で処理を落とす。
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
// 処理対象(この数だけgoroutineを立てる)
target := []int{1, 2, 3}
inf := make(chan bool)
go func(inf chan bool) {
for i := range target {
fmt.Println("goroutine up : ", i)
go ctr(target[i], make(chan int))
}
}(inf)
// 永遠に返ることがない
<-inf
}
func ctr(n int, c chan int) {
go loop(n, c)
select {
case <-c:
fmt.Println("die and up:", n)
ctr(n, c)
}
}
func loop(no int, c chan int) {
defer func() { c <- no }()
for {
fmt.Println("loop:", no)
time.Sleep(1 * time.Second)
if rand.Intn(10) == 1 {
// テスト用に一定確率で落とす
return
}
}
}