GO语言实现生产者消费者模型
一、只使用Channel实现
package main
import (
"fmt"
"math/rand"
"sync"
"time"
)
func producter(index int,ch chan<- int)
{
for {
num:=rand.Intn(1000)
ch<-num
fmt.Printf("生产者%d生产:%d\n",index,num)
time.Sleep(time.Second)
}
}
func consumer(index int,ch <-chan int)
{
for {
num:=<-ch
fmt.Printf("消费者%d消费:%d\n",index,num)
}
}
func main
{
rand.Send(time.Now().UnixNano())
ch:=make(chan int,5)
for i:=0;i<5;i++ {
go producter(i+1,ch)
}
for i:=0;i<5;i++ {
go consumer(i+1,ch)
}
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()
num:=rand.Intn(1000)
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)
for i := 0; i < 5; i++ {
go producer(ch,1)
}
for i := 0; i < 5; i++ {
go customer(ch,i+1)
}
for ; ; {
;
}
}