要知道进程/线程的数量越多,切换成本就越大,也就越浪费,高消耗CPU。
goroution特点:1.内存几KB,而且可以大量存在。
2.灵活调度,可常切换。
一、创建 goroution
main 里的 goroution 是主,而自定义的方法是子。一旦 main 中的停止,子也不会进行。看下面一段代码:
package main
import (
"fmt"
"time"
)
//子Goroution
func newTask() {
i := 0
for {
i++
fmt.Printf("new Goroution : i = %d\n", i)
time.Sleep(1 * time.Second)
}
}
//主Goroution
func main() {
//创建一个go程 去执行newTask()流程
go newTask()
// i := 0
// for {
// i++
// fmt.Printf("main Goroution : i = %d\n", i)
// time.Sleep(1 * time.Second)
// }
fmt.Println("main goroution is exit")
}
在你本地 ide 先运行一下main中for循环没有注释的吧。我们会发现 main goroution 会跟 new goroution 一起执行。而当我们把 for 注释掉换成打印那一行,他就会终止运行。我本地的 ide 只会打印出下面这两行:
new Goroution : i = 1
main goroution is exit
二、退出 goroution
匿名方法,看下面的一段代码:
package main
import (
"fmt"
"runtime"
"time"
)
func main() {
//用go创建承载一个形参为空的匿名函数,返回值为空的一个函数
go func() {
defer fmt.Println("A.defer") //后执行
func() {
defer fmt.Println("B.defer")
//退出当前goroution
//return//只退出当前子函数
runtime.Goexit()//只会打印出B.defer A.defer
fmt.Println("B")
}()
fmt.Println("A") //先执行
}() //这个小括号就相当于是调用了
//死循环
for {
time.Sleep(1 * time.Second)
}
}
退出当前的 goroution 方法为 runtime.Goexit(),而代码里的 return 只是退出当前的子函数。