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 case 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 가 unreachable 상태 가 되면 runtime. SetFinalizer 를 촉발 하여 stopJanitor 가 runJanitor 가 시작 하 는 goroutine 을 중단 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
set containerThere is no built-in set container in Go How to implement Set struct{} => type struct{}{} => 0bytes How to create set :=...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.