[关闭]
@LIUHUAN 2017-11-25T13:07:16.000000Z 字数 1784 阅读 1343

Go 生产者消费者模型

Go


1.生产者消费者模型的实现

  1. func main() {
  2. in := make(chan int)
  3. out := make(chan int)
  4. go Producer(in)
  5. go Consumer(in, out)
  6. for x := range out { //读取管道,直到关闭,如果没有值,那么阻塞
  7. fmt.Println(x)
  8. }
  9. }
  10. func Consumer(in <-chan int, out chan<- int) {
  11. for x := range in { //读取管道,直到关闭管道为止,没有值,那么阻塞
  12. out <- x * x //写入管道
  13. }
  14. close(out) //关闭写入管道
  15. }
  16. func Producer(out chan<- int) {
  17. for i := 1; i < 10; i++ {
  18. out <- i //写入管道
  19. }
  20. close(out) //关闭写管道
  21. }

2.channel的性质

1.使用make创建channel,且创建的变量为和,map,slice等一致均为引用类型

  1. ch := make(chan Type,Len)//
  2. ch := make(chan int)//创建一个int类型的管道

2.Channel使用方式

2.1 向管道写入内容

  1. x := 1
  2. ch <- x //写入内容

2.2 从管道读取内容

  1. x := <- ch //读取内容

2.3 使用for range 从管道读取内容

  1. for x := range ch {
  2. //do something with x
  3. }

2.4 关闭管道

  1. close(ch)

2.Bufer Channel使用方式

  1. const (
  2. N = 1000000
  3. Buflen = 100
  4. )
  5. func main(){
  6. main_channel()
  7. main_channel_buffer()
  8. }
  9. func main_channel_buffer() {
  10. start := time.Now()
  11. defer func(){
  12. cost := time.Since(start)
  13. fmt.Println("channel_buffer_cost=",cost)
  14. }()
  15. in := make(chan int,Buflen)
  16. out := make(chan int,Buflen)
  17. go Producer(in)
  18. go Consumer(in, out)
  19. for x := range out {
  20. x += 1
  21. }
  22. }
  23. func main_channel() {
  24. start := time.Now()
  25. defer func(){
  26. cost := time.Since(start)
  27. fmt.Println("channel_cost=",cost)
  28. }()
  29. in := make(chan int)
  30. out := make(chan int)
  31. go Producer(in)
  32. go Consumer(in, out)
  33. for x := range out {
  34. x += 1
  35. }
  36. }
  37. func Consumer(in <-chan int, out chan<- int) {
  38. for x := range in {
  39. out <- x * x
  40. }
  41. close(out)
  42. }
  43. func Producer(out chan<- int) {
  44. for i := 1; i < N; i++ {
  45. out <- i
  46. }
  47. close(out)
  48. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注