一、语言进阶-并发编程
并发:指两个或多个事件在同一时间间隔内发生。这些事件宏观上是同时发生的,但微观上是交替发生的。由于并发是在多处理器上面并发,所以并发编程的一个优点就是会使程序运行速度很快。
并行:指两个或多个事件在同一时刻同时发生。
并发和并行的区别在于并发是多线程程序在一个核的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语言进行并发编程,并提供了一些代码示例。可以通过观看书籍和视频对这一部分进行更深刻的理解。