go语言中协程与主线程退出逻辑是三种处理方式及示例代码
如何实现go协程执行完之后,主协程在结束当前程序?
方式1:
是用channel实现。
根据协程数量,设置一个有缓冲区的channel,当channel的长度为0时,则表示协程执行结束。
package main
import (
"fmt"
"time"
)
var channel = make(chan int, 1)
func goroutines() {
for i := 0; i < 100; i++ {
fmt.Println("go程", i)
}
channel <- 1
close(channel)
func main() {
go goroutines()
for {
val, status := <-channel
fmt.Println(val)
if !status {
fmt.Println("channel closed!")
break
}
}
}
方式2:
使用sync.WiatGroup实现。
通过计数器实现,开启协程是wg.Wait()会一直处于阻塞状态。
当协程执行完之后,对计数器-1,直到为0的时候,自动退出。
一定要在Wait()执行之前,使用Add()。
不要在协程内部中去执行Add(),这样容易导致在执行到Wait()时,可能协程还未来得及执行Add()。
package main
import (
"fmt"
"sync"
)
func goroutines() {
for i := 0; i < 100; i++ {
fmt.Println("go程", i)
}
wg.Done()
}
var wg sync.WaitGroup
func main() {
wg.Add(1)
go goroutines()
wg.Wait()
}
方式3:
使用sleep()方式实现。
package main
import (
"fmt"
"time"
)
func goroutines() {
for i := 0; i < 100; i++ {
fmt.Println("go程", i)
}
}
func main() {
go goroutines()
time.Sleep(time.Second * 5)
}
ps:
sleep()时间不好掌握,如果协程执行时间长,设置的时间短,导致协程还未执行结束完,主线程就退出。如果协程执行时间短,此时主线程就会一直等待,直到设置的时间,浪费资源。
相关文章