신호를 사용하여 Go에서 고루틴을 정상적으로 중지하는 방법은 무엇입니까?

Barbara Streisand
풀어 주다: 2024-10-28 13:23:02
원래의
443명이 탐색했습니다.

How to Gracefully Stop a Goroutine in Go Using Signals?

신호로 고루틴 중지

Go에서 고루틴은 동시성에 사용되는 경량 스레드입니다. 그러나 고루틴을 조기에 종료해야 하는 시나리오가 있을 수 있습니다. 이 문서에서는 신호 메커니즘을 사용하여 이를 달성하는 방법을 살펴봅니다.

제공된 코드에서 목표는 특정 조건(tooLate)이 true가 되면 고루틴을 중지하는 것입니다. 그러나 제안된 대로 두 번째 채널을 사용하면 실제로 읽을 때 고루틴이 차단됩니다.

선택과 함께 추가 채널 사용

더 나은 접근 방식은 별도의 채널( tooLate) 및 goroutine에서 select를 사용하여 처리 채널(proCh)과 tooLate 채널을 모두 모니터링합니다. tooLate가 신호를 받으면 고루틴은 정상적으로 종료될 수 있습니다.

<code class="go">package main

import "fmt"
import "time"

func main() {
    tooLate := make(chan struct{})
    proCh := make(chan string)

    go func() {
        for {
            fmt.Println("working")
            time.Sleep(1 * time.Second)
            select {
            case <-tooLate:
                fmt.Println("stopped")
                return
            case proCh <- "processed":
            default: // Adding default makes it non-blocking
            }
            fmt.Println("done here")
        }
    }()

    select {
    case proc := <-proCh:
        fmt.Println(proc)
    case <-time.After(1 * time.Second):
        fmt.Println("too late")
        close(tooLate)
    }

    time.Sleep(4 * time.Second)
    fmt.Println("finish\n")
}</code>
로그인 후 복사

이 업데이트된 코드에서는 타이머가 만료되면(너무 늦었음을 나타냄) tooLate 채널이 닫히고 고루틴에 신호를 보냅니다. 고루틴은 이 신호를 수신하고 그에 따라 종료됩니다.

sync.Cond 사용

고려해야 할 또 다른 옵션은 신호에 대한 보다 세부적인 제어를 제공하는 sync.Cond를 사용하는 것입니다. 하지만 좀 더 많은 설정과 동기화 로직이 필요합니다.

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

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