基本使用

使用 Queue.Pop

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. "github.com/gogf/gf/v2/os/gtimer"
  6. "github.com/gogf/gf/v2/container/gqueue"
  7. )
  8. func main() {
  9. q := gqueue.New()
  10. // 数据生产者,每隔1秒往队列写数据
  11. gtimer.SetInterval(time.Second, func() {
  12. v := gtime.Now().String()
  13. q.Push(v)
  14. fmt.Println("Push:", v)
  15. })
  16. // 3秒后关闭队列
  17. gtimer.SetTimeout(3*time.Second, func() {
  18. q.Close()
  19. })
  20. // 消费者,不停读取队列数据并输出到终端
  21. for {
  22. if v := q.Pop(); v != nil {
  23. fmt.Println(" Pop:", v)
  24. } else {
  25. break
  26. }
  27. }
  28. // 第3秒时关闭队列,这时程序立即退出,因此结果中只会打印2秒的数据。 执行后,输出结果为:
  29. // Output:
  30. // Push: 2021-09-07 14:03:00
  31. // Pop: 2021-09-07 14:03:00
  32. // Push: 2021-09-07 14:03:01
  33. // Pop: 2021-09-07 14:03:01
  34. }

使用 Queue.C

  1. package main
  2. import (
  3. "context"
  4. "fmt"
  5. "time"
  6. _ "github.com/gogf/gf/contrib/drivers/mysql/v2"
  7. "github.com/gogf/gf/v2/container/gqueue"
  8. "github.com/gogf/gf/v2/os/gctx"
  9. "github.com/gogf/gf/v2/os/gtime"
  10. "github.com/gogf/gf/v2/os/gtimer"
  11. )
  12. func main() {
  13. queue := gqueue.New()
  14. gtimer.AddTimes(gctx.GetInitCtx(), time.Second, 3, func(ctx context.Context) {
  15. queue.Push(gtime.Now().String())
  16. })
  17. for {
  18. select {
  19. case queueItem := <-queue.C:
  20. fmt.Println(queueItem)
  21. case <-time.After(3 * time.Second):
  22. fmt.Println("timeout, exit loop")
  23. return
  24. }
  25. }
  26. }

元素入队/出队

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. "github.com/gogf/gf/v2/os/gtimer"
  6. "github.com/gogf/gf/v2/container/gqueue"
  7. )
  8. func main() {
  9. q := gqueue.New()
  10. for i := 0; i < 10; i++ {
  11. q.Push(i)
  12. }
  13. fmt.Println(q.Pop())
  14. fmt.Println(q.Pop())
  15. fmt.Println(q.Pop())
  16. // Output:
  17. // 0
  18. // 1
  19. // 2
  20. }

队列长度

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. "github.com/gogf/gf/v2/os/gtimer"
  6. "github.com/gogf/gf/v2/container/gqueue"
  7. )
  8. func main() {
  9. q := gqueue.New()
  10. q.Push(1)
  11. q.Push(2)
  12. fmt.Println(q.Len())
  13. // size是len方法的别称
  14. fmt.Println(q.Size())
  15. // May Output:
  16. // 2
  17. // 2
  18. }

队列关闭

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. "github.com/gogf/gf/v2/os/gtimer"
  6. "github.com/gogf/gf/v2/container/gqueue"
  7. )
  8. func main() {
  9. q := gqueue.New()
  10. for i := 0; i < 10; i++ {
  11. q.Push(i)
  12. }
  13. fmt.Println(q.Pop())
  14. q.Close()
  15. fmt.Println(q.Pop())
  16. fmt.Println(q.Len())
  17. // Output:
  18. // 0
  19. // <nil>
  20. // 0
  21. }

gqueueglist

gqueue 的底层基于 glist 链表实现动态大小特性,在队列满写入数据或在队列空时读取数据会产生阻塞。

glist 是一个并发安全的链表,并可以允许在关闭并发安全特性的时和一个普通的 list 链表无异,在存储和读取数据时不会发生阻塞。