golang cache 소스 코드 학습

github 소스 주소

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 을 중단 합 니 다.

좋은 웹페이지 즐겨찾기