教育模板网站建设,360优化大师,推广教程,WordPress主题1002无标题1、数据队列可以存储任意类型的一个数据#xff08;下程序是添加整数值#xff09;。
数据队列代码点这里查看《go语言结构体实现数据结构队列#xff08;先进先出#xff09;存储数据#xff08;逐行注释#xff09;》
2、读写操作并发进行#xff08;下程序向队列中…1、数据队列可以存储任意类型的一个数据下程序是添加整数值。
数据队列代码点这里查看《go语言结构体实现数据结构队列先进先出存储数据逐行注释》
2、读写操作并发进行下程序向队列中逐个写入100个数据项。
3、读取的时候有最大读取量下列程序一次最多读取5个数据项读取数据后相应的数据项从队列中删除。
4、添加数据完毕、并且队列无数据后退出程序。
package mainimport (fmtsynctime
)var wq NewWorkQueue() // 数据队列
var fz false // 添加任务完毕后设置为true
var wgroup sync.WaitGroup{} // 用于同步等待协程完成
var readMax 5 // 一次最多获取数据量
var ch make(chan struct{}, readMax) // 控制获取数据量func main() {wgroup.Add(1) // 添加数据协程1go A() // 动态添加数据B() // 动态获取数据wgroup.Wait() // 等待协程完成
}// 动态添加数据
func A() {for i : 1; i 100; i {wq.Add(i) // 队列添加数据time.Sleep(100 * time.Millisecond) // 模拟添加需要时间}fz true // 添加数据完成告知数据获取协程wgroup.Done() // 添加数据完成
}// 动态获取数据
func B() {for {if fz wq.Size() 0 { // 添加数据已完成并且数据链长度为0return // 退出获取数据操作} // 添加数据已完成并且队列为空时退出获取数据if wq.Size() 0 { // 数据链上有数据节点go func() {defer wgroup.Done() // 完成后协程计数-1wgroup.Add(1) // 协程计数1防止退出data : wq.Pop() // 从数据队列取出一个数据if data ! nil { // 数据存在时因判断队列长度到取出数据过程中可能有其他协程取走数据导致获取到空值// 从数据队列获取数据通过信号量控制并发数量ch - struct{}{} // 获取信号量占用一个并发资源满时等待任务释放后继续执行wgroup.Add(1) // 协程计数1防止退出go func(data interface{}) {defer func() {-ch // 任务完成释放信号量归还并发资源wgroup.Done() // 完成后协程计数-1}()time.Sleep(2 * time.Second) // 模拟获取数据后处理数据时间fmt.Print(data) // 数据使用完成}(data)}}()}}
}