最近在学习go的并发,然后像实现生产者和消费者模型。
基本的想法就是从文件理读取列表,经生产者处理之后放到缓冲隧道里,然后由消费者进行消费,下边是代码
```go
package main
import (
"fmt"
"io/ioutil"
"runtime"
"strings"
"sync"
"time"
)
func read_file(filename string)([]string){
b, err := ioutil.ReadFile(filename)
if err != nil {
fmt.Print(err)
}
str := string(b)
last_resu := strings.Split(str, "\n")
return last_resu
}
func producer(arg string, ch chan string, wgp sync.WaitGroup){
defer wgp.Done()
ch <- arg
fmt.Println("消费者 " + arg)
}
func consumer(ch chan string, wgc sync.WaitGroup){
time.Sleep(time.Second*4)
defer wgc.Done()
mess:= <- ch
fmt.Println("生产者消耗 " + mess)
}
func main() {
resu := read_file("ip.txt")
num := runtime.NumCPU()
if len(resu)<num{
num=len(resu)
}else {
num=num
}
ch := make(chan string, num)
var wgp sync.WaitGroup
var wgc sync.WaitGroup
for _, val := range resu{
wgp.Add(1)
wgc.Add(1)
go producer(val, ch, wgp)
go consumer(ch, wgc)
}
wgp.Wait()
close(ch)
wgc.Wait()
}
```
然后就是有一个问题,文件里的数据被处理完了之后怎么让生产者和消费者优雅的退出
![屏幕快照 2018-11-17 下午2.16.27.png](https://static.studygolang.com/181117/bc9ef670370f079c3c3ab75762ee0395.png)
有疑问加站长微信联系(非本文作者)