如何优雅的退出goroutine
来源:互联网 发布:网络主播行业分析 编辑:程序博客网 时间:2024/06/06 01:00
问题来源
项目中,同步数据的时候使用多个goroutine来对一组数据进行同步请求,同步采用http的方式,所有的数据同步完成需要一个整体的响应时间,在响应时间内goroutine按照正常的结果来处理,如果超过了响应时间那么对于还没有处理完的goroutine则认为是数据同步异常。
golang中判断超时的处理办法
在golang中通过channel来对程序的超时进行判断。
- main方法通过select的方式来接收c1中的信息。如果select接收到了time.After发来的结果,那么判断程序运行的具体内容已经超过1s,则goruntine超时。
//举个例子func main(){ c1 := make(chan string, 1) defer close(c1) go func(){ //需要运行的具体内容 c1 <- "result" }() select { case res := <-c1: fmt.Println(res) case <-time.After(time.Second * 1): fmt.Println("timeout 1") }}
这里的超时判断使用了channel,context包也是通过chanel来对超时进行通知,不过有更丰富的操作。
但是注意到,虽然main方法得到了goruntine超时的信息,但是goruntine并没有停止。如果阻塞的goruntine没有得到及时的处理,那么goruntine会越来越多。需要一种方式来让goruntine停下来。
值得注意的一点:goruntine的退出是不会随着调用其的方法退出的,但如果主程序退出了,那么goruntine一定会退出
优雅的退出goruntine
最开始的想法是,通过在外部停止的方法来停掉所有超时的goruntine。
对于golang,这种方法是其不推荐的,同时也是很危险的。关于goid的内容how to get goid这里有解释
优雅的退出goruntine的方法是,严格的掌握控制每一个goruntine的运行时间(对于向上透明的方法,更应该了解其超时机制来避免运行超时的产生)。对于遇到的http这种同步这种问题,则需要对请求超时进行设置。
- 当你开始一个goruntine的时候,一定要知道goruntine会在何时停止。
一些相关的参考:
针对“从外部结束一个 goroutine”的分析
end a blocked goroutine from outside
in golang, does it make sense to write non-blocking code?
What happens when a goroutine blocks
why 1000 goroutine generats 1000 os threads
知乎goruntine介绍
- 如何优雅的退出goroutine
- 优雅的结束goroutine
- 如何优雅的退出android应用
- 应用的优雅退出
- golang如何优雅处理退出
- JVM安全退出(如何优雅的关闭java服务)
- 安卓开发如何优雅的实现退出整个程序
- Goroutine是如何工作的
- 如何得到goroutine 的 id?
- 外部控制goroutine退出
- 如何优雅地退出python程序
- python 如何优雅地退出子进程
- golang的goroutine是如何实现的
- 【Linux学习笔记】kill及kill -9的用法及如何实现进程的优雅退出
- kill及kill -9的用法及如何实现进程的优雅退出
- kill及kill -9的用法及如何实现进程的优雅退出
- kill及kill -9的用法及如何实现进程的优雅退出
- 当系统内存不足时如何优雅的关闭或退出应用。
- php Phar 打包
- Glide V4 框架新特性(Migrating from v3 to v4)
- android scrollerview嵌套recycleview滑动卡顿
- Django 之 (4)配置
- JDBC_大数据和批处理
- 如何优雅的退出goroutine
- bzoj1584 [Usaco2009 Mar]Cleaning Up 打扫卫生 dp
- Mybaits--一对多关系配置文件(带源码)
- 顺序栈的定义及相关操作
- OpenGL编程指南(第八版)第一个渲染三角形案例代码在win8双显卡电脑VS2015中运行方法总结
- 滑雪问题(dfs+递归)记忆化搜索 c语言
- HDU
- 【设计模式】行为型模式(上)
- 1. Android