goroutine

// code_037_concurrency_goroutine project main.gopackage mainimport ( "fmt" "time")//并发,concurrency; 并行,parallel;而Go从语言层面就支持了并行,而Go语言提供了自动垃圾回收机制。//goroutine说到底其实就是协程,执行goroutine只需极少的栈内存(大概是4~5KB),当然会根据相应的数据伸缩func newTask() { i := 0 for { i++ fmt.Printf("new gorotine: i= %d\n", i) time.Sleep(1 * time.Second) if i == 10 { break } }}func main() { go newTask() //goroutine>>> 主goroutine退出后,其它的工作goroutine也会自动退出 i := 0 for { i++ fmt.Printf("main goroutine : i =%d\n", i) time.Sleep(1 * time.Second) if i == 10 { break } }}Goexit >>>

// code_039_goroutine_runtime_Goexit project main.gopackage mainimport ( "fmt" "runtime")//备注:调用 runtime.Goexit() 将立即终止当前 goroutine 执⾏,调度器确保所有已注册 defer延迟调用被执行。func main() { go func() { defer fmt.Println("A.defer") func() { defer fmt.Println("B.defer") runtime.Goexit() // 终止当前 goroutine, import "runtime" fmt.Println("B") //不会执行 }() fmt.Println("A") //不会执行 }() //死循环,目的不让主goroutine结束 for { }}Gosched >>>

// code_038_goroutine_runtime project main.gopackage mainimport ( "fmt" "runtime")func main() { //runtime包:Gosched()、Goexit()、GOMAXPROCS() //runtime.Gosched() 用于让出CPU时间片,让出当前goroutine的执行权限,调度器安排其他等待的任务运行,并在下次某个时候从该位置恢复执行。 //调用 runtime.Goexit() 将立即终止当前 goroutine 执行,调度器确保所有已注册 defer延迟调用被执行。 //调用 runtime.GOMAXPROCS() 用来设置可以并行计算的CPU核数的最大值,并返回之前的值。 go func(s string) { for i := 0; i < 5; i++ { fmt.Println(s) } }("world") for i := 0; i < 5; i++ { runtime.Gosched() fmt.Println("Hello") }}GOMAXPROCS >>>

// code_040_goroutine_runtime_GOMAXPROCS project main.gopackage mainimport ( "fmt" "runtime")//调用 runtime.GOMAXPROCS() 用来设置可以并行计算的CPU核数的最大值,并返回之前的值。func main() { n := runtime.GOMAXPROCS(1) // n := runtime.GOMAXPROCS(2) fmt.Printf("n=%d\n", n) for { go fmt.Print(0) fmt.Print(1) }}