预计:大约完成后完成 2秒
实际:无限期运行.
不明白可能导致它无限期运行的原因.
package main
import (
"context"
"fmt"
"time"
)
func main() {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
for i := range generator(ctx) {
select {
case <-time.After(2 * time.Second):
cancel()
return
default:
fmt.Println(i)
}
}
}
func generator(ctx context.Context) <-chan int {
ch := make(chan int)
go func() {
count := 0
for {
select {
case <-ctx.Done():
return
case ch <- count:
count++
}
}
}()
return ch
}
Run Code Online (Sandbox Code Playgroud)
主要问题是您的通道返回generator(ctx)值几乎与您读取它们的速度一样快.
创建的通道time.After(2 * time.Second)几乎立即被丢弃,并且每次迭代通过生成器创建一个新的超时通道.
如果你做了一个小小的改变; 在循环外创建超时通道,然后将它放在您将看到它开始工作的select子句中.
timeout := time.After(2 * time.Second)
for i := range generator(ctx) {
select {
case <-timeout:
cancel()
return
default:
fmt.Println(i)
}
}
Run Code Online (Sandbox Code Playgroud)
https://play.golang.org/p/zb3wn5FJuK
| 归档时间: |
|
| 查看次数: |
273 次 |
| 最近记录: |