go协程和go主线程
- Go 主线程(有程序员直接称为线程/也可以理解成进程):
- 一个 Go 线程上,可以起多个协程,可以这样理解,协程是轻量级的线程[编译器做优化]。
- Go 协程的特点
- 1) 有独立的栈空间
- 2) 共享程序堆空间
- 3) 调度由用户控制
- 4) 协程是轻量级的线程
演示案例
- 请编写一个程序,完成如下功能:
- 1) 在主线程(可以理解成进程)中,开启一个 goroutine, 该协程每隔 1 秒输出 "hello,world"
- 2) 在主线程中也每隔一秒输出"hello,golang", 输出 10 次后,退出程序
- 3) 要求主线程和 goroutine 同时执行.
- 4) 画出主线程和协程执行流程图
package main import ( "fmt" "strconv" "time" ) //编写一个函数,每隔1秒输出 "hello,world" func test() { for i := 1; i <= 10; i++ { fmt.Println("tesst () hello,world " + strconv.Itoa(i)) time.Sleep(time.Second) } } func main() { go test() // 开启了一个协程 for i := 1; i <= 10; i++ { fmt.Println(" main() hello,golang" + strconv.Itoa(i)) time.Sleep(time.Second) } }
- 输出结果:
- 输出的效果说明, main 这个主线程和 test 协程同时执行.
- 示意图
小结
主线程是一个物理线程,直接作用在 cpu 上的。是重量级的,非常耗费 cpu 资源。
协程从主线程开启的,是轻量级的线程,是逻辑态。对资源消耗相对小。
Golang 的协程机制是重要的特点,可以轻松的开启上万个协程。
其它编程语言的并发机制是一般基于线程的,开启过多的线程,资源耗费大,这里就突显 Golang 在并发上的优势了