one-one
先创建out.go目录与文件夹
// 定义了一个名为out的包,用于处理输出相关的功能。
package out
import "fmt"
// Out结构体定义了一个channel,用于存储需要输出的数据。
type Out struct {
data chan interface{
} // data字段是一个interface{}类型的channel,用于存储任意类型的数据。
}
// out是一个全局变量,指向Out类型的指针,用于全局访问。
var out *Out
// Newout函数用于创建一个新的Out实例,如果全局变量out为nil,则创建一个新的Out实例并初始化其data字段。
// 如果out已经初始化,则直接返回现有的out实例。
func Newout() *Out {
if out == nil {
out = &Out{
make(chan interface{
}, 65535), // 初始化data字段为一个容量为65535的channel。
}
}
return out
}
// Println函数用于向Out实例的data channel发送数据。
// 它接受一个interface{}类型的参数i,并将i发送到out的data channel中。
func Println(i interface{
}) {
out.data <- i // 向channel发送数据。
}
// OutPut方法是Out结构体的方法,用于从data channel中接收数据并打印。
// 它是一个无限循环,使用select语句监听data channel。
// 当channel中有数据时,使用fmt.Println打印接收到的数据。
func (o *Out) OutPut() {
for {
select {
case i := <-o.data: // 从channel中接收数据。
fmt.Println(i) // 打印接收到的数据。
}
}
}
同时创建one-one.go文件,来实现单生产者单消费者模型
// 定义了一个名为one_one的包,用于实现生产者-消费者模式。
package one_one
import (
"producer-consumer/out" // 导入自定义的out包,用于输出功能。
"sync" // 导入sync包,用于同步goroutine。
)
// Task结构体定义了一个任务,包含一个ID字段。
type Task struct {
ID int64
}
// Task的run方法用于执行任务,这里只是简单地打印任务的ID。
func (t *Task) run() {
out.Println(t.ID) // 使用out包的Println函数打印任务ID。
}
// taskCh是一个缓冲channel,用于在生产者和消费者之间传递Task对象。
var taskCh = make(chan Task, 10)
// taskNum定义了要生成的任务数量。
const taskNum int64 = 1000
// producer函数是一个生产者goroutine,它生成taskNum个任务并发送到channel。
func producer(wo chan<- Task) {
var i int64
for i = 1; i < taskNum; i++ {
t := Task{
i} // 创建一个新的Task对象。
wo <- t // 将Task对象发送到channel。
}
close(wo) // 生产结束后关闭channel。
}
// consumer函数是一个消费者goroutine,它从channel接收任务并执行。
func consumer(ro <-chan Task) {
for t := range ro
Go语言实现多种生产消费模型

最低0.47元/天 解锁文章
765

被折叠的 条评论
为什么被折叠?



