/*
协程的创建: go关键字 创建新协程
*/
package main
import (
"fmt"
"time"
)
func NewTask() {
for {
fmt.Println("This is a new task")
time.Sleep(time.Second)
}
}
func main() {
go NewTask() //新建一个协程(子协程) 新建一个任务
for {
fmt.Println("This is a main goroutine")
time.Sleep(time.Second)
}
}
主goroutine先退出
/*
重点: 主协程退出了,其他子协程也会跟着退出
*/
package main
import (
"fmt"
"time"
)
func main() {
go func() { //调用匿名函数
j := 0
for {
j++
fmt.Println("j = ", j)
time.Sleep(time.Second)
}
}()
i := 0
for {
i++
fmt.Println("i = ", i)
time.Sleep(time.Second)
if i == 5 {
break
}
}
}
主协程先退出导致子协程来不及调用
package main
import (
"fmt"
"time"
)
func main() {
go func() { //调用匿名函数
j := 0
for {
j++
fmt.Println("j = ", j)
time.Sleep(time.Second)
}
}()
}
Gosched的使用
/*
针对的问题: 主协程由于执行的快,导致主协程执行完了,子协程还没来得及执行
*/
package main
import (
"fmt"
"runtime"
)
func main() {
go func() {
for i := 0; i < 5; i++ {
fmt.Println("Hello")
}
}()
for i := 0; i < 2; i++ {
//让出时间片 先让别的协程执行 别的协程执行完 再来执行此协程
runtime.Gosched()
fmt.Println("Hello Go")
}
}