goroutine回收机制
goroutine用了fork-join模型
这个模型也就是一种分治的思想
会把所有的goroutine fork发出去 然后再join收集回来
收集回来的join过程中使用了channel
同时一个join点可能是多个goroutine的同步
fork出去之后在返回之前当前的goroutine是对发出去的goroutine没办法控制的
虽然我们可以用context来限定超时
但是因为goroutine的context上下文只关联了reader使用者和receiver接收者 没有对发送者进行关联
所以如果reading使用者超时 sender没有办法对其进行终止 只能sender终止自己
这个reading的goroutine就泄漏了
所以goroutine没有很好的回收机制
这个问题似乎只能靠重启解决了
增加个timeout也就是少重启了几次
参考:
https://stackoverflow.com/questions/50570961/stop-goroutine-execution-on-timeout?answertab=votes#tab-top