Ticker.Stop()은 Golang에서 어떻게 작동하며 티커 고루틴의 우아한 종료를 어떻게 보장할 수 있나요?

Linda Hamilton
풀어 주다: 2024-11-09 04:38:02
원래의
553명이 탐색했습니다.

How does Ticker.Stop() behave in Golang, and how can we ensure graceful exits for ticker goroutines?

Golang의 티커 중지 동작: 우아한 종료 처리

Golang에서 티커 채널은 정기적으로 발생하는 이벤트를 생성하는 데 일반적으로 사용됩니다. 그러나 적절한 채널 처리를 보장하려면 Stop()의 작동 방식을 이해하는 것이 중요합니다.

다음 코드 조각을 고려하세요.

ticker := time.NewTicker(1 * time.Second)
go func() {
    for _ = range ticker.C {
        log.Println("tick")
    }
    log.Println("stopped")
}()
time.Sleep(3 * time.Second)
log.Println("stopping ticker")
ticker.Stop()
time.Sleep(3 * time.Second)
로그인 후 복사

ticker.Stop()이 호출되면 티커는 다음과 같습니다. 일시중지되었지만 채널이 자동으로 닫히지 않습니다. 이는 고루틴이 일시 중지되지만 종료되지는 않음을 의미합니다. 위 코드를 실행하면 다음 출력이 생성됩니다.

2013/07/22 14:26:53 tick
2013/07/22 14:26:54 tick
2013/07/22 14:26:55 tick
2013/07/22 14:26:55 stopping ticker
로그인 후 복사

따라서 goroutine은 추가 티커 이벤트를 기다리며 차단된 상태로 유지됩니다.

이 문제를 해결하려면 두 번째 채널을 사용하여 통신할 수 있습니다. 티커 고루틴에 대한 요청을 중지합니다. 예는 다음과 같습니다.

package main

import (
    "log"
    "sync"
    "time"
)

type Ticker struct {
    sync.Mutex
    ticker *time.Ticker
    stop   chan struct{}
}

func (t *Ticker) Start(d time.Duration) {
    t.Lock()
    defer t.Unlock()

    if t.ticker != nil {
        t.ticker.Stop()
    }

    t.ticker = time.NewTicker(d)
    t.stop = make(chan struct{})

    go func() {
        for {
            select {
            case <-t.ticker.C:
                log.Println("tick")
            case <-t.stop:
                return
            }
        }
    }()
}

func (t *Ticker) Stop() {
    t.Lock()
    defer t.Unlock()

    if t.stop != nil {
        close(t.stop)
        t.ticker.Stop()
    }
}

func main() {
    t := Ticker{}
    t.Start(1 * time.Second)

    time.Sleep(3 * time.Second)
    log.Println("stopping ticker")
    t.Stop()

    time.Sleep(3 * time.Second)
}
로그인 후 복사

별도의 중지 채널을 사용하면 Ticker.Stop() 메서드가 호출될 때 티커 고루틴이 올바르게 종료되도록 할 수 있습니다.

위 내용은 Ticker.Stop()은 Golang에서 어떻게 작동하며 티커 고루틴의 우아한 종료를 어떻게 보장할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿