• 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. }

  • 相关阅读:
    C++入门(前言、命名空间、缺省参数、重载)
    arm-linux 应用层调用驱动函数
    武汉流星汇聚:跨境电商蓝海市场,比利时在线市场增长迅速
    文本分词2.0
    10.21 - 每日一题 - 408
    Java:在Java 8及更高版本中使用Java流
    Mysql 面试题总结
    C++之通俗易懂学模版
    面向对象、方法重写、重载(overload)与重写(override)的区别、super关键字、构造方法的特殊性
    MySQL集群高可用架构之MMM
  • 原文地址:https://blog.csdn.net/wuxiaoyu0806/article/details/140364471