컨텍스트를 사용하여 설정된 시간 후에 고루틴을 정상적으로 중지하는 방법은 무엇입니까?

Barbara Streisand
풀어 주다: 2024-11-20 14:48:18
원래의
771명이 탐색했습니다.

How to Gracefully Stop Goroutines After a Set Time Using Context?

컨텍스트를 사용하여 지정된 기간 이후 고루틴을 중지하는 방법

문제 배경

수많은 HTTP 호출이 고루틴에서 조정되는 로드 테스트에서는 다음과 같은 문제가 발생합니다. 이러한 루틴의 실행 기간을 제어하는 ​​데 중요합니다. 이를 통해 사용자는 미리 정의된 시간에 부하 테스트를 종료할 수 있습니다.

실패한 접근 방식

이를 달성하기 위한 일반적인 시도 중 하나는 고루틴을 사용하여 시간을 모니터링하는 것입니다.Sleep() 기간 및 종료 신호 브로드캐스트 채널을 통해. 특정 경우에는 이 방법으로 충분할 수 있지만 고루틴이 기본 고루틴 외부에서 계속 HTTP 호출을 수행하면 실패합니다.

해결책: 컨텍스트 사용

Go 1.7에서는 이 문제를 해결하기 위해 필수 컨텍스트 패키지를 도입합니다. . 컨텍스트는 고루틴 실행을 취소하고 모니터링하는 구조화된 방법을 제공하여 시간 기반 종료를 위한 안정적인 솔루션을 제공합니다.

package main

import (
    "context"
    "fmt"
    "time"
)

func test(ctx context.Context) {
    t := time.Now()

    select {
    case <-time.After(1 * time.Second):
        fmt.Println("overslept")
    case <-ctx.Done():
    }
    fmt.Println("used:", time.Since(t))
}

func main() {
    ctx, _ := context.WithTimeout(context.Background(), 50*time.Millisecond)
    test(ctx)
}
로그인 후 복사

설명:

  1. 테스트 함수 내부에서 50밀리초의 시간 초과가 생성됩니다.
  2. select 문은 시간을 확인합니다.채널에 이벤트가 발생한 후 (수면 완료 표시) 또는 컨텍스트가 취소된 경우.
  3. 컨텍스트 시간이 초과되면 select 문이 종료되어 고루틴이 취소되었음을 나타냅니다.

이 접근 방식은 다음을 보장합니다. 코드 내 위치에 관계없이 지정된 시간이 지나면 고루틴이 취소됩니다.

위 내용은 컨텍스트를 사용하여 설정된 시간 후에 고루틴을 정상적으로 중지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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