Golang学习笔记 - channel

更新于 2022-11-22 19:22 49
专栏: Golang 标签: Go

简单的使用管道

  1. package main
  2. import "fmt"
  3. func main() {
  4. // var ch1 chan int // 引用类型,需要初始化才能使用
  5. // ch1 = make(chan int, 1)
  6. // 简写
  7. ch1 := make(chan int, 1) // 带缓冲区,异步操作
  8. // ch1 := make(chan int) // 无缓冲区,必须有接收,又称为同步通道
  9. ch1 <- 10
  10. x := <-ch1
  11. // len(ch1) // 获取通道长度
  12. // cap(ch1) // 获取通道容量
  13. fmt.Println(x)
  14. close(ch1)
  15. }

两个goroutine,两个channel

  1. package main
  2. import "fmt"
  3. // 两个goroutine,两个channel
  4. // 1.生成0~100的数字发送到ch1中
  5. // 2.从ch1中取出数据计算它的平方,把结果发送到ch2中
  6. // 存值
  7. // 生成0-100的数字发送到ch1中
  8. func fn1(ch chan<- int) {
  9. for i := 0; i < 100; i++ {
  10. ch <- i
  11. }
  12. close(ch)
  13. }
  14. func fn2(ch1 <-chan int, ch2 chan<- int) {
  15. // 从通道取值方式1
  16. for {
  17. tmp, ok := <-ch1
  18. if !ok {
  19. break
  20. }
  21. ch2 <- tmp * tmp
  22. }
  23. close(ch2)
  24. }
  25. func main() {
  26. ch1 := make(chan int, 100)
  27. ch2 := make(chan int, 200)
  28. go fn1(ch1)
  29. go fn2(ch1, ch2)
  30. // 从通道取值方式2
  31. for res := range ch2 {
  32. fmt.Println(res)
  33. }
  34. }

简单的工作池模拟

5个任务,最大同时工作3进程

  1. package main
  2. import (
  3. "fmt"
  4. "time"
  5. )
  6. func worker(id int, jobs <-chan int, results chan<- int) {
  7. for j := range jobs {
  8. fmt.Printf("worker:%d start job:%d\n", id, j)
  9. time.Sleep(time.Second)
  10. fmt.Printf("worker:%d end job:%d\n", id, j)
  11. results <- j * 2
  12. }
  13. }
  14. func main() {
  15. jobs := make(chan int, 100)
  16. results := make(chan int, 100)
  17. // 开启3个goroutine
  18. for w := 1; w <= 3; w++ {
  19. go worker(w, jobs, results)
  20. }
  21. // 5个任务
  22. for j := 1; j <= 5; j++ {
  23. jobs <- j
  24. }
  25. close(jobs)
  26. // 输出结果
  27. for a := 1; a <= 5; a++ {
  28. <-results
  29. }
  30. }

互斥锁

  1. package main
  2. import (
  3. "fmt"
  4. "sync"
  5. )
  6. var (
  7. x int64
  8. wg sync.WaitGroup
  9. lock sync.Mutex // 互斥锁
  10. )
  11. func add() {
  12. for i := 0; i < 5000; i++ {
  13. lock.Lock() // 上锁
  14. x = x + 1
  15. lock.Unlock() // 释放锁
  16. }
  17. wg.Done()
  18. }
  19. func main() {
  20. wg.Add(2)
  21. go add()
  22. go add()
  23. wg.Wait()
  24. fmt.Println(x)
  25. }

学习来源:https://www.liwenzhou.com/posts/Go/14_concurrence/