>  기사  >  백엔드 개발  >  golang에서 고루틴을 중지하는 방법(4가지 방법)

golang에서 고루틴을 중지하는 방법(4가지 방법)

PHPz
PHPz원래의
2023-04-11 10:42:061301검색

Golang은 동시성과 효율성이 높은 프로그래밍을 구축하기 위해 설계된 언어로, 편리하고 효율적인 고루틴 메커니즘을 제공하여 프로그램의 실행 효율성과 성능을 크게 향상시킬 수 있습니다. 그러나 고루틴을 사용할 때 고루틴 실행을 중지하는 방법과 같이 주의해야 할 사항이 있습니다. 다음에서는 고루틴을 중지하는 방법에 중점을 둘 것입니다.

고루틴의 기본

고루틴을 중지하는 방법을 이해하기 전에 먼저 고루틴에 대한 기본 지식을 이해해야 합니다. 고루틴은 Golang 언어의 경량 스레드 구현이며 하나 이상의 스레드에서 실행될 수 있습니다. Go 런타임 시스템에 의해 관리되며 독립적이고 가벼운 실행 단위입니다. 기존 스레드와 달리 고루틴은 실행 시 Go 런타임 시스템에 의해 자동으로 예약되며, 예약 모델도 매우 효율적입니다. 높은 동시성을 지원할 수 있을 뿐만 아니라 멀티 코어 CPU를 최대한 활용할 수도 있습니다.

고루틴을 만드는 방법

Go 언어에서는 다음 두 가지 일반적인 방법으로 고루틴을 만들 수 있습니다.

  1. go 키워드 사용
go func() {
    //goroutine运行的代码
}()
  1. go 키워드 및 함수 이름 사용
func myFunc() {
    //goroutine运行的代码
}

go myFunc()

방법 to stop goroutine

goroutine을 중지하는 것은 더 복잡한 문제입니다. 왜냐하면 goroutine은 실행 시 명시적인 종료 및 정지 방법을 제공하지 않기 때문입니다. Go 언어의 설계 목표 중 하나는 고루틴이 실행 중에 차단되는 것을 방지하는 것이므로 이를 중지하려면 특별한 기술이 필요하기 때문입니다.

Go 언어에는 고루틴을 중지하는 네 가지 방법이 있습니다.

1. 채널 사용

채널을 사용하는 것은 고루틴을 중지하는 가장 간단하고 안전한 방법 중 하나입니다. bool 유형 채널을 생성하면 고루틴을 중지해야 할 때 이 채널에 신호를 보낼 수 있습니다.

func worker(stopChan chan bool) {
    for {
        select {
        case <-stopChan:
            fmt.Println("worker stopped")
            return
        default:
            fmt.Println("worker is running")
            time.Sleep(time.Second)
        }
    }
}

func main() {
    stopChan := make(chan bool)
    go worker(stopChan)
    time.Sleep(3 * time.Second)
    stopChan <- true
    time.Sleep(time.Second)
}
2. 컨텍스트 사용

Go1.7에서는 표준 라이브러리에 컨텍스트 패키지가 추가되어 고루틴을 일시 중지하고 취소하는 새로운 방법을 제공했습니다. 각 고루틴에 Context 매개변수를 전달한 다음, 고루틴을 중지해야 할 때 이 Context 변수에 대해 취소 작업을 수행할 수 있습니다.

func worker(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            fmt.Println("worker stopped")
            return
        default:
            fmt.Println("worker is running")
            time.Sleep(time.Second)
        }
    }
}

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    go worker(ctx)
    time.Sleep(3 * time.Second)
    cancel()
    time.Sleep(time.Second)
}
3. 공유 변수를 통해 고루틴 중지를 제어하려면 Mutex 및 WaitGroup

을 사용하세요. 이 방법을 사용하려면 동기화 패키지에서 Mutex 및 WaitGroup을 사용해야 합니다. Mutex는 공유 변수의 읽기 및 쓰기를 보호하는 데 사용되고 WaitGroup은 모든 고루틴이 완료될 때까지 기다리는 데 사용됩니다.

var wg sync.WaitGroup
var stop bool
var mutex sync.Mutex

func worker() {
    defer wg.Done()
    for {
        mutex.Lock()
        if stop {
            mutex.Unlock()
            fmt.Println("worker stopped")
            return
        }
        fmt.Println("worker is running")
        mutex.Unlock()
        time.Sleep(time.Second)
    }
}

func main() {
    for i := 0; i < 3; i++ {
        wg.Add(1)
        go worker()
    }
    time.Sleep(3 * time.Second)
    mutex.Lock()
    stop = true
    mutex.Unlock()
    wg.Wait()
    time.Sleep(time.Second)
}
4. 런타임 패키지를 사용하세요

런타임 패키지를 사용하는 방법은 좀 더 번거롭습니다. 고루틴을 실행하는 코드에서는 정기적으로 전역 변수를 확인해야 하며, 그 후 고루틴을 중지해야 할 경우에는 강제로 종료하려면 런타임 패키지의 함수를 사용하세요.

var stop bool

func worker() {
    for {
        if stop {
            fmt.Println("worker stopped")
            return
        }
        fmt.Println("worker is running")
        time.Sleep(time.Second)
    }
}

func main() {
    go worker()
    time.Sleep(3 * time.Second)
    stop = true
    time.Sleep(time.Second)
    runtime.Goexit() //退出当前运行的goroutine
}

Summary

고루틴을 사용하면 프로그램의 동시성 성능이 크게 향상될 수 있지만, 고루틴의 작동을 제어하는 ​​것도 매우 중요합니다. 고루틴을 우아하게 중지하는 방법은 우리가 직면해야 할 문제가 되었습니다. 위의 네 가지 방법에는 각각의 장점과 적용 가능한 시나리오가 있으므로 특정 상황에 따라 가장 적합한 방법을 선택해야 합니다.

위 내용은 golang에서 고루틴을 중지하는 방법(4가지 방법)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.