Go语言入门-工程实践笔记(一) | 青训营

66 阅读2分钟

一、语言进阶-并发编程

并发:指两个或多个事件在同一时间间隔内发生。这些事件宏观上是同时发生的,但微观上是交替发生的。由于并发是在多处理器上面并发,所以并发编程的一个优点就是会使程序运行速度很快。

并行:指两个或多个事件在同一时刻同时发生。

并发和并行的区别在于并发是多线程程序在一个核的cpu上运行,而并行则是多线程程序在多个核的cpu上运行。

由于go语言可以充分发挥多核优势,所以能够高效运行。

1.1 Goroutine

协程:协程位于用户态,是轻量级线程,栈的级别是kb;

线程:线程位于内核态,线程用于跑多个协程,栈的级别是mb。

用户态和内核态的区别:
用户态:处于用户态时,说明此时正在运行的是应用程序,此时只能执行非特权指令。
内核态:处于内核态时,说明此时正在运行的是内核程序,此时可以执行特权指令。

例如:快速打印 hello goroutine : 0~hello goroutine : 4

func hello(i int) {
    println("hello goroutine : " + fmt.Sprint(i))
}

func HelloGoRoutine() {
    for i := 0; i<5; i++ {
        go func(j int) {
            hello(j)
        }(i)
    }
    time.Sleep(time.Second)
}
1.2 CSP

Go 语言中的 CSP(Communicating Sequential Processes)并发模型是一种基于通信的并发模型,它通过在不同的协程之间传递消息来实现并发。在 Go 语言中,CSP 并发模型通过使用 Go 语言中的 channel(通道)来实现。

CSP并发模型有通过共享内存和通过共享内存实现通信,但是提倡通过通信共享内存而不是通过共享内存而实现通信。

1.3 Channel

channel的创建方式为

make(chan 元素类型,[缓冲大小])

channel有两种通道:
无缓冲通道 make(chan int)
有缓冲通道 make(chan int,2)

例如如下程序:

func CalSquare() {
    src := make(chan int)
    dest := make(chan int,3)
    //子协程发送0-9数字
    go func() {
        defer close(src)
        for i := 0; i < 10; i++ {
             src <- i
        }
    }()
    //子协程计算输入数字的平方,主协程输出最后的平方数
    go func() {
        defer close(dest)
        for i := range src {
                dest <- i*i
        }
    }()
    for i := range dest {
        println(i)
    }
}

总结

本文介绍了如何使用Go语言进行并发编程,并提供了一些代码示例。可以通过观看书籍和视频对这一部分进行更深刻的理解。