这部分,等我全部梳理完成后再回来完善
学了一年408,现在又看到了你们
进程
线程
Go协程和Go主线程 Go主线程(有程序员直接称为线程/也可以理解为进程):一个Go线程上,可以创建多个协程。
Go协程的特点
- 有独立的栈空间
- 共享程序堆空间
- 调度由用户控制
- 协程是轻量级线程
Goroutine是与其他函数或方法同时运行的函数或方法。Goroutines可以被认为是轻量级的线程。与线程相比,创建Goroutine的成本很小,它就是一段代码,一个函数入口。以及在堆上为其分配的一个堆栈(初始大小为4K,会随着程序的执行自动增长删除)。因此它非常廉价,Go应用程序可以并发运行数千个Goroutines。大多数Golang程序同时使用数千个Goroutine
goroutine的使用方式
在函数或方法调用前面加上关键字go
案例
package main
import (
"fmt"
"time"
)
func odd() {
for i := 0; i < 100; i++ {
fmt.Println("odd: ", i)
time.Sleep(1 * time.Second)
}
}
func even() {
for i := 0; i < 100; i++ {
fmt.Println("even: ", i)
time.Sleep(1 * time.Second)
}
}
func main() {
go odd()
go even()
for i := 0; i < 100; i++ {
fmt.Println("main: ", i)
time.Sleep(1 * time.Second)
}
}
增加睡眠函数可以更加直观的感受到并发的效果
停止一个协程
通过向Goroutine发送一个信号通道来停止它。Goroutines只能在被告知检查时响应信号,因此需要在逻辑位置上包含检查
package main
import (
"fmt"
)
func main() {
quit := make(chan bool)
go func(){
for {
select {
case <-quit:
return
default:
//
}
}
}()
quit <- true
}