Golang项目:实现生产者消费者模式

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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值