以下是 gqueue 包中一些常用的队列类型:
1. gqueue.Queue:
- 用途:普通的队列实现,不是并发安全的。
- 示例:
queue := gqueue.New()
queue.Push(1)
queue.Push(2)
value := queue.Pop()
2. gqueue.NewSafe(options ...gqueue.SafeOption) *gqueue.Safe:
- 用途:安全队列,通过对每个操作使用锁来确保并发安全。
- 示例:
safeQueue := gqueue.NewSafe()
safeQueue.Push(1)
safeQueue.Push(2)
value := safeQueue.Pop()
3. gqueue.NewLazy(options ...gqueue.LazyOption) *gqueue.Lazy:
- 用途:懒惰队列,在队列中元素数量为零时,懒惰地不执行 Pop 操作。
- 示例:
lazyQueue := gqueue.NewLazy()
lazyQueue.Push(1)
lazyQueue.Push(2)
value := lazyQueue.Pop()
4. gqueue.NewPriority(options ...gqueue.PriorityOption) *gqueue.Priority:
- 用途:优先队列,每个元素都有一个优先级,优先级高的元素会先被 Pop 出队列。
- 示例:
priorityQueue := gqueue.NewPriority()
priorityQueue.Push(1, 10)
priorityQueue.Push(2, 5)
value := priorityQueue.Pop()
这些队列类型提供了不同的特性,可以根据实际需求选择适当的队列类型。以下是一个简单的示例,演示了如何使用 gqueue.Queue 和 gqueue.Safe:
package main
import (
"fmt"
"github.com/gogf/gf/container/gqueue"
"sync"
)
func main() {
// 创建一个普通队列
queue := gqueue.New()
// 创建一个安全队列
safeQueue := gqueue.NewSafe()
// 使用 WaitGroup 同步并发操作
var wg sync.WaitGroup
wg.Add(2)
// 并发向普通队列中添加元素
go func() {
defer wg.Done()
queue.Push(1)
queue.Push(2)
}()
// 并发向安全队列中添加元素
go func() {
defer wg.Done()
safeQueue.Push(3)
safeQueue.Push(4)
}()
// 等待两个 goroutine 完成
wg.Wait()
// 从普通队列中获取元素
for {
value := queue.Pop()
if value == nil {
break
}
fmt.Println("Queue Value:", value)
}
// 从安全队列中获取元素
for {
value := safeQueue.Pop()
if value == nil {
break
}
fmt.Println("Safe Queue Value:", value)
}
}
在这个示例中,通过 gqueue.New() 创建了一个普通队列和通过 gqueue.NewSafe() 创建了一个安全队列。两个 goroutine 分别向这两个队列中添加元素,然后分别从这两个队列中取出元素。由于安全队列使用了锁,因此在并发访问时可以安全地执行 Push 和 Pop 操作。
转载请注明出处:http://www.zyzy.cn/article/detail/7715/GoFrame