GO语言实现生产者消费者模型

GO语言实现生产者消费者模型

一、只使用Channel实现

package main

import (
	"fmt"
	"math/rand"
	"sync"
	"time"
)
//生产者函数
func producter(index int,ch chan<- int)
{
    for {
        //获得1~1000的随机数
        num:=rand.Intn(1000)
        //将随机数写入Channel中
        ch<-num
       	fmt.Printf("生产者%d生产:%d\n",index,num)
		time.Sleep(time.Second)
    }
}
//消费者函数
func consumer(index int,ch <-chan int)
{
     for {
        //从Channel中读取数据,如果没有数据则堵塞
        num:=<-ch
       	fmt.Printf("消费者%d消费:%d\n",index,num)
    }
}

func main
{
    //将随机数种子设置为当前时间的纳秒
    rand.Send(time.Now().UnixNano())
	//创建一个带有缓冲区的Channel
    ch:=make(chan int,5)
    //创建5个生产者go程
    for i:=0;i<5;i++ {
        go producter(i+1,ch)
    }
    //创建5个消费者go程
    for i:=0;i<5;i++ {
        go consumer(i+1,ch)
    }
    //保证主go程不退出
    for {
        
    }
}

二、条件变量加Channel

package main

import (
	"fmt"
	"math/rand"
	"time"
)
//条件变量
var cond sys.Cond
//共享数据
var num int
//生产者函数
func producter(index int,ch chan<- int)
{
    for {
        //加锁
        cond.lock()
        //获得1~1000的随机数
        num:=rand.Intn(1000)
        //将随机数写入Channel中
        ch<-num
       	fmt.Printf("生产者%d生产:%d\n",index,num)
        //唤醒消费者
        con.Signal()
        cond.L.Unlock
		time.Sleep(time.Second)
    }
}
//消费者函数
func consumer(index int,ch <-chan int)
{
     for {
        for ; ; {
		cond.L.Lock()
		for len(ch)==0 {
			cond.Wait()
		}
		num:=<-ch
		fmt.Printf("消费者go程 %d 消费:%d\n",index,num)
		//唤醒阻塞的生产者线程
		cond.Signal()
		cond.L.Unlock()
		time.Sleep(time.Second)
	}
        num:=<-ch
       	fmt.Printf("消费者%d消费:%d\n",index,num)
    }
}
func main
{
  	//初始化条件变量的锁
	cond.L=new(sync.Mutex)
	//初始化随机数种子
	rand.Seed(time.Now().UnixNano())
	//创建通道
	ch:=make(chan int,5)
	//循环创建生产者go程
	for i := 0; i < 5; i++ {
		go producer(ch,1)
	}
	//循环创建消费者go程
	for i := 0; i < 5; i++ {
		go customer(ch,i+1)
	}
	for ; ; {
		;
	}
}

猜你喜欢

转载自blog.csdn.net/qq_44630120/article/details/106305679