• GO channel 学习


    引言

    单纯地将函数并发执行是没有意义的。函数与函数间需要交换数据才能体现并发执行函数的意义。
    虽然可以使用共享内存进行数据交换,但是共享内存在不同的goroutine中容易发生竞态问题。为了保证数据交换的正确性,必须使用互斥量对内存进行加锁,这种做法势必造成性能问题。


    Go语言的并发模型是CSP(Communicating Sequential Processes),提倡通过通信共享内存而
    不是通过共享内存而实现通信。如果说goroutine是Go程序并发的执行体,channel就是它们之间的连接。channel是可以让一个goroutine发送特定值到另一个goroutine的通信机制。


    Go 语言中的通道(channel)是一种特殊的类型。通道像一个传送带或者队列,总是遵循先入先出
    (First In First Out)的规则,保证收发数据的顺序。每一个通道都是一个具体类型的导管,也
    就是声明channel的时候需要为其指定元素类型。 

    1. package main
    2. import "fmt"
    3. // 类似于pipe[]管道
    4. func main() {
    5. //ch := make(chan int, 10) //有缓冲大小的管道
    6. //ch <- 12
    7. //var x int
    8. //x = <-ch
    9. //fmt.Println(x)
    10. //c := make(chan int) //开辟的空间 cap是3,长度
    11. //
    12. //go func() {
    13. // defer println("go 程关闭")
    14. // fmt.Println("go 程运行正在向chan写入数据")
    15. // c <- 666 //由于是无缓冲的,所以必须得立刻接收,不然一直阻塞
    16. //}()
    17. //num := <-c
    18. //fmt.Println("主程序接受管道 值为:", (num))
    19. //fmt.Println(len(c), cap(c))
    20. //ch := make(chan int)
    21. //go func() {
    22. // defer close(ch) //延迟关闭通道
    23. // for i := 0; i < 5; i++ {
    24. // ch <- i
    25. // }
    26. //}()
    27. //for {
    28. // if data, ok := <-ch; ok {
    29. // fmt.Println(data)
    30. // } else {
    31. // break
    32. // }
    33. //}
    34. /*
    35. c := make(chan int)
    36. go func() {
    37. for i := 0; i < 5; i++ {
    38. c <- i
    39. time.Sleep(1 * time.Second)
    40. }
    41. close(c)
    42. }()
    43. //迭代,会自动阻塞
    44. for data := range c {
    45. fmt.Println(data)
    46. }*/
    47. // select 多路复用
    48. c := make(chan int)
    49. quit := make(chan int)
    50. go func() {
    51. for i := 0; i < 5; i++ {
    52. fmt.Println(<-c)
    53. }
    54. quit <- 0
    55. }()
    56. fibonace(c, quit)
    57. }
    58. func fibonace(c, quit chan int) {
    59. x, y := 1, 1
    60. for {
    61. select {
    62. case c <- x: //如果c可写 ,x就会进来
    63. x, y = y, x+y
    64. case <-quit:
    65. fmt.Println("quit")
    66. return
    67. }
    68. }
    69. }

  • 相关阅读:
    yum命令应用
    i.MX 6ULL 驱动开发 一:搭建开发环境
    U++ 创建UI
    kibana启动报错
    leetcode - 365周赛
    渡众机器人自动驾驶小车运行Autoware 实现港口物流运输
    【vSphere 8 自签名证书】企业 CA 签名证书替换 vSphere Machine SSL 证书Ⅰ—— 生成 CSR
    【问题总结】 记 一次dockerFile构建报错
    JVM 常见的垃圾回收算法
    「学习笔记」Garsia-Wachs 算法
  • 原文地址:https://blog.csdn.net/wuxiaoyu0806/article/details/140364471