什么是 goroutine?简称可以使:go程、并发
go语言天生支持多并发,使用方式:
package main
import ("fmt""time"
)
func display(count int) {for {fmt.Println("这是子go程======>:", count)time.Sleep(1)count++}
}func main() {go display(1)// 匿名 子go程 函数//go func () {// count := 1// for {// fmt.Println("这是子go程======>:", count)// time.Sleep(1)// count++// }//}()// 主go程count := 1for {fmt.Println("这是主go程:", count)count++time.Sleep(1)if count > 2 {break}}
}
可以看到,主进程没有打印第3次,而子进程打印了第3次

比如起3个进程跑goroutine,cpu资源会被竞争不确定谁先谁后:
for i := 0; i <= 3; i++ {go func() {}()
}
三种退出go程方式:
package mainimport ("fmt""os""time"
)func main() {go func() {func() {fmt.Println("这是子go程 内部函数111")//return // 只结束此函数,会执行到:子go程222//runtime.Goexit() // 退出当前go程,不会执行到:子go程222os.Exit(-1) // 退出所以主子进程}()fmt.Println("子go程222")}()time.Sleep(1)fmt.Println("结束主go程!")
}
通道可用于两个 goroutine 之间通过传递一个指定类型的值来同步运行和通讯。操作符 <- 用于指定通道的方向,发送或接收。如果未指定方向,则为双向通道。
ch <- value // 把 value 发送到通道 ch
value := <-ch // 从 ch 接收数据,并把值赋给 value
chan双向管道:
package main
import ("fmt""time"
)func main() {// 创建一个容量为10的int有缓冲管道numChan := make(chan int, 10)// 写“管道”数据go func() {for i := 1; i < 21; i++ {numChan <- ifmt.Println("11-->子go程写入数据:", i)}// 写入结束,关闭管道close(numChan)}()// 读“管道”数据go func() {for num := range numChan {fmt.Println("22-->子go程读取数据data:", num)}}()time.Sleep(1 * time.Second)// 判断管道是否关闭for {v, ok := <-numChanif !ok {fmt.Println("管道已经关闭,准备退出!!")break}fmt.Println("v:", v)}
}
一般用于函数参数,比如只读、只写单向管道,看看下面和双向管道有何区别?
生产者:chan<-
消费者:<-chan
双向管道时都是:<-numChan
package main
import ("fmt""time"
)// 生产者:只写入数据
func producer(out chan<- int) {for i := 1; i < 11; i++ {out <- ifmt.Println("写入数据:", i)}close(out)
}// 消费者:只读数据
func consumer(in <-chan int) {for v := range in {fmt.Println("读取数据:", v)}
}func main() {// 创建一个双向通道numChan := make(chan int, 5)// 创建生产者go producer(numChan)// 创建消费者go consumer(numChan)time.Sleep(200)
}

在多go程并发时,我们可以通过select进行监听到对应数据,突然觉得类似消息事件一样,一个负责推、一个负责监听…
select:监听多管道 (写入/读写数据、关闭管道)
package main
import ("fmt""time"
)func main() {// 创建两个管道,用来测试监听chan1 := make(chan int)chan2 := make(chan int)// 监听go程go func() {for {select {case data1 := <-chan1:fmt.Println("监听到chan111:", data1)case data2 := <-chan2:fmt.Println("监听到chan222:", data2)default:fmt.Println("正常监听中...")time.Sleep(2 * time.Second)}}}()// go程:两个管道分别写入数据go func() {for i := 0; i < 5; i++ {chan1 <- ii++chan2 <- i}}()count := 1for {time.Sleep(10 * time.Second)if count == 6 {break}count++}
}

以上就是今天学习的内容,本文仅仅简单介绍了goroutine的使用,而在项目中如何实践还请大家多多查阅资料了解!
下一篇:什么是IO