目录
只需要在语句前添加go关键字,就可以创建并发执行单元
package main
import (
"fmt"
"time"
)
//测试协程
//循环打印内容
func newTask() {
i := 0
for {
i++
fmt.Printf("new goroutine:i=%d\n", i)
time.Sleep(1 * time.Second)
}
}
//main()相当于是主协程
func main() {
//启动子协程
go newTask()
i := 0
for {
i++
fmt.Printf("main goroutine:i=%d\n", i)
time.Sleep(1 * time.Second)
}
}
如果主协程退出了,其他任务还执行吗?不执行
package main
import (
"fmt"
"time"
)
//main()相当于是主协程
func main() {
//匿名子协程
go func() {
i := 0
for {
i++
fmt.Println("子协程 i=", i)
time.Sleep(1 * time.Second)
}
}()
i := 0
for {
i++
fmt.Println("主协程 i=", i)
time.Sleep(1 * time.Second)
//主协程第二次后退出
if i == 2 {
break
}
}
}
程序没任何输出,也不报错
package main
import (
"fmt"
"time"
)
//main()相当于是主协程
func main() {
//匿名子协程
go func() {
i := 0
for {
i++
fmt.Println("子协程 i=", i)
time.Sleep(1 * time.Second)
}
}()
}
runtime.Gosched():用于让出CPU时间片,调度器重新安排任务调度,还是有几率分配到它的
package main
import (
"fmt"
"runtime"
)
func main() {
//匿名子协程
go func(s string) {
for i := 0; i < 2; i++ {
fmt.Println(s)
}
}("world")
//主协程
for i := 0; i < 2; i++ {
runtime.Gosched()
fmt.Println("hello")
}
}
runtime.Goexit():立即终止当前协程
package main
import (
"fmt"
"time"
"runtime"
)
func main() {
//匿名子协程
go func() {
defer fmt.Println("A.defer")
//匿名函数
func() {
defer fmt.Println("B.defer")
//此时只有defer执行
runtime.Goexit()
fmt.Println("B")
}()
fmt.Println("A")
}()
for {
time.Sleep(time.Second)
}
}
runtime.GOMAXPROCS():设置并行计算的CPU核数,返回之前的值
package main
import (
"runtime"
"fmt"
)
func main() {
n := runtime.GOMAXPROCS(3)
fmt.Println("n=%d\n",n)
//循环执行2个
for{
go fmt.Print(0)
fmt.Print(1)
}
}
定义一个channel时,也需要定义发送到channel的值的类型
make(chan 类型)
make(chan 类型, 容量)
channel通过操作符<-来接收和发送数据,发送和接收数据语法:
channel <- value
<-channel
x := <-channel
x, ok := <-channel
未完待续...
原文:https://www.cnblogs.com/konghui/p/10703615.html