-
Notifications
You must be signed in to change notification settings - Fork 0
golang concurrency
foolmacky edited this page Sep 12, 2021
·
3 revisions
- https://jxck.hatenablog.com/entry/20130414/1365960707
- シンプルで無駄のないコードは常にすべてのスタートになると思う
- channelをクロージャーで参照している
- タイムアウトを実現するサンプル
func randomTime() time.Duration {
return time.Duration(rand.Intn(1e3)) * time.Millisecond
}
func worker(msg string) <-chan string {
receiver := make(chan string)
for i := 0; i < 300; i++ {
go func(i int) {
time.Sleep(randomTime())
msg := fmt.Sprintf("%d %s done", i, msg)
receiver <- msg
}(i)
}
return receiver
}
func main() {
receiver := worker("job")
for {
select {
case receive := <-receiver:
log.Println(receive)
case <-time.After(time.Second): // 一定時間経過したら受信
log.Println("timeout")
return // 受信時に終われば timeout 処理になる。
}
}
}
- 並列数を制御するサンプル
func worker(msg string) <-chan string {
limit := make(chan int, 5)
receiver := make(chan string)
go func() {
for i := 0; i < 100; i++ {
log.Println(runtime.NumGoroutine())
limit <- 1
go func(i int) {
msg := fmt.Sprintf("%d %s done", i, msg)
receiver <- msg
<-limit
}(i)
}
}()
return receiver
}
func main() {
receiver := worker("job")
for i := 0; i < 100; i++ {
log.Println(<-receiver)
}
}