声明指定大小的ring作为缓存区大小,一边写缓冲区,一边消费缓冲区,若无数据则等待
package main
import (
"container/ring"
"fmt"
"time"
)
func main() {
r := ring.New(10)
cursor := r // 声明一个游标来消费
fmt.Println(r.Len()) // 打印缓存区大小
// 缓冲区塞入数据
go func() {
for i := 0; i < 100; i++ {
if r.Value == nil {
fmt.Println("往缓存区塞入,", i)
r.Value = i
r = r.Next()
} else {
fmt.Println("缓存区阻塞,等待消费,", r.Value)
}
time.Sleep(2 * time.Second)
}
}()
// 消费缓冲区
for {
time.Sleep(2 * time.Second)
if cursor.Value != nil {
fmt.Println("缓存数据: 消费成功。", cursor.Value)
cursor.Value = nil
cursor = cursor.Next()
} else {
fmt.Println("缓存数据: 等待塞入")
}
}
}
执行结果:
go run main.go
10
往圈里塞入 0
往圈里塞入 1
消费圈: 成功 0
往圈里塞入 2
消费圈: 成功 1
消费圈: 成功 2
往圈里塞入 3
往圈里塞入 4
...
网友评论