示例代码:
package main import ( "fmt" `time` ) // 唱歌 func sing() { for i:=0;i<50;i++ { fmt.Println("----正在唱:隔壁泰山----") } } // 跳舞 func dance() { for i:=0;i<50;i++ { fmt.Println("----正在跳舞:赵四街舞----") } } func main() { go sing() // 开启goroutine go dance() // 另一个goroutine,会抢夺CPU执行权,两个goroutine交替执行 time.Sleep(time.Second) }
示例代码:
package main import ( "fmt" "time" ) func main() { go func() { // 创建一个 子go 程 for i := 0; i < 5; i++ { fmt.Println("------I'm goroutine -------") time.Sleep(time.Second) } }() // 主goroutine结束,子goroutine随着退出 // 所以,子goroutine很有可能没有执行完就退出了 fmt.Println("------I'm main-------") }
示例代码:
package main import ( "fmt" "runtime" ) func main() { go func() { for { runtime.Gosched() fmt.Println("goroutine 1执行。。。。") } }() for { runtime.Gosched() // 出让当前 cpu 时间片。 fmt.Println("主go程执行。。。。") } }
示例代码:
package main import ( "fmt" "runtime" `time` ) func test() { defer fmt.Println("退出子go程之前") // return runtime.Goexit() // 退出当前go程。 defer fmt.Println("退出子go程之后") } func main() { fmt.Println("主go程开始执行") go func() { fmt.Println("父go程执行之前") // runtime.Goexit() 会确保defer执行 defer fmt.Println("defer 父go程执行之后") go test() fmt.Println("父go程执行之后") }() fmt.Println("主go程结束执行") time.Sleep(time.Second) }
示例代码:
package main import ( "fmt" "runtime" ) func main() { fmt.Println(runtime.GOROOT()) n := runtime.GOMAXPROCS(0) // 0表示最大 fmt.Println("n = ", n) // 返回上次设置成功的设置值 n = runtime.GOMAXPROCS(2) fmt.Println("n = ", n) // 16 n = runtime.GOMAXPROCS(4) fmt.Println("n = ", n) // 2 n = runtime.GOMAXPROCS(8) fmt.Println("n = ", n) // 4 n = runtime.GOMAXPROCS(1) fmt.Println("n = ", n) // 8 }
示例代码
package main import ( "fmt" "time" ) // 全局定义channel, 用来完成数据同步 var flagChan = make(chan struct{}) // 空struct不占用空间 // 定义一台打印机 func printer(s string) { for _, ch := range s { fmt.Printf("%c", ch) // 屏幕:stdout time.Sleep(300 * time.Millisecond) } } // 定义两个人使用打印机 func person1() { // person 先执行。 printer("hello") flagChan <- struct{}{} // 写入数据,解除阻塞 } func person2() { // person 后执行 printer("world") flagChan <- struct{}{} // 写入数据,解除阻塞 } func main() { go person1() <-flagChan // 拿到数据之前,一直阻塞,所以会等到go程执行结束,直到写入 go person2() <- flagChan fmt.Println("\n程序执行结束!!!") }