go语言中协程与主线程退出逻辑是三种处理方式及示例代码
Go  /  管理员 发布于 2年前   1460
如何实现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()时间不好掌握,如果协程执行时间长,设置的时间短,导致协程还未执行结束完,主线程就退出。如果协程执行时间短,此时主线程就会一直等待,直到设置的时间,浪费资源。
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号