大佬教程收集整理的这篇文章主要介绍了golang cache 源码学习,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
func newCacheWithJanitor(de time.Duration,ci time.Duration,m map[string]*Item) *Cache {
c := newCache(de,m)
// This trick ensures that the janitor goroutine (which--granted it
// was enabled--is running DeleteExpired on c forever) does not keep
// the returned C object from being garbage collected. When it is
// garbage collected,the finalizer stops the janitor goroutine,after
// which c can be collected.
C := &Cache{c}
if ci > 0 {
runJanitor(c,ci)
runtime.SetFinalizer(C,stopJanitor)
}
return C
}
这段程序的关键点在于C := &Cache{c} 和* runtime.SetFinalizer(C,stopJanitor)*
首先,
func (j *janitor) Run(c *cache) {
j.stop = make(chan bool)
tick := time.Tick(j.Interval)
for {
select {
case <-tick:
c.DeleteExpired()
case <-j.stop:
return
}
}
}
func runJanitor(c *cache,ci time.Duration) {
j := &janitor{
Interval: ci,}
c.janitor = j
go j.Run(c)
}
可以看到runJanitor是启动了一个goroutine用于清除过期的缓存,这个goroutine是一直执行的,周期的检查c中有没有过期的缓存,所以c一直不会被垃圾回收。为了让程序停掉的时候该gorountine也能够停止,就需要利用C := &Cache{c}和runtime.SetFinalizer.
利用C := &Cache{c}, c虽然不会被垃圾回收,但是C会,那么当C被垃圾回收时,C变成unreachable 的状态,就会触发runtime.SetFinalizer,执行stopJanitor停止runJanitor启动的goroutine。
以上是大佬教程为你收集整理的golang cache 源码学习全部内容,希望文章能够帮你解决golang cache 源码学习所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。