>  기사  >  백엔드 개발  >  time.AfterFunc()에 의해 재귀적으로 호출되는 고루틴은 제대로 설계되지 않았습니다.

time.AfterFunc()에 의해 재귀적으로 호출되는 고루틴은 제대로 설계되지 않았습니다.

WBOY
WBOY앞으로
2024-02-09 13:48:21820검색

由 time.AfterFunc() 递归调用的 goroutine 的设计很糟糕

PHP 편집자 Xigua는 "time.AfterFunc()에 따라 재귀적으로 호출되는 고루틴의 디자인은 매우 나쁘다"라는 문장은 불합리한 디자인 아이디어를 반영한다고 믿습니다. 동시 프로그래밍에서 고루틴을 재귀적으로 호출하면 과도한 리소스 소비가 발생할 수 있으며 심지어 교착 상태 및 메모리 오버플로와 같은 문제가 발생할 수도 있습니다. 따라서 재귀 호출은 주의해서 사용해야 하며, 프로그램의 성능과 안정성을 보장하기 위해서는 문제 해결을 위한 다른 대안을 고려해야 합니다. 코드를 작성할 때 불필요한 문제를 피하기 위해 항상 디자인의 합리성에 주의를 기울여야 합니다.

질문 내용

작은 http 애플리케이션(A)이 있습니다. 시작 시 다른 http 서비스(B)를 호출하여 라이센스를 확인하고 라이센스가 정상이면 http 서버(A)가 시작됩니다. 인증에 실패하면 치명적인 오류가 발생하고 종료됩니다

라이센스 확인은 24시간마다 진행됩니다

24시간마다 새로운 고루틴을 재귀적으로 생성하는 것이 나쁜 디자인으로 간주됩니까? 아래에서 내 코드를 확인하세요. 이전 고루틴이 종료되나요, 아니면 계속 실행되고 n개의 고루틴이 서로 호출하고 종료되나요?

각 새로운 고루틴은 메인 고루틴에서 호출되나요, 아니면 하위 고루틴에서 호출되나요?

라이센스 확인 모듈. A 검사 서비스 B

으아악

HTTP 서버(A)가 시작되기 전 메인 패키지에서

func Request(retry bool) error {
    // request and verify license (external http service)
    err := verify_license()
    if err != nil {
        return err
    }
    
    if retry {
        //  Renew verification timeout (renew license every 24 hours)
        time.AfterFunc(LICENSE_TIMEOUT, func(){
            request_retry()
        })
    }
    
    return nil
}

func request_retry(){
    for i := 0; i < LICENSE_RETRY; i++ {
        if err := v.Request(false); err == nil {
            break
        }
        
        time.Sleep(LICENSE_RETRY_TIMEOUT)
    }
    
    time.Sleep(LICENSE_TIMEOUT)
    v.Request(true)
}

Solution

문제의 설계를 다시 생각해 볼 수도 있습니다. 예:

으아악

기본적으로 이것이 수행하는 작업은 주기적으로 확인하고 문제가 발생하면 컨텍스트나 채널에 알리는 고루틴을 만드는 것입니다.

질문을 올바르게 이해했다면 간단하게 설명하면 됩니다. 한 가지 기본 요소는 요청이 실패할 경우 요청을 다시 시도하는 것입니다. 그렇지 않으면 24시간 동안 재시도됩니다. 마지막 계층은 검사가 실패할 경우 이에 반응하는 것입니다. 컨텍스트, 채널 또는 원하는 무엇이든 사용할 수 있습니다

위 내용은 time.AfterFunc()에 의해 재귀적으로 호출되는 고루틴은 제대로 설계되지 않았습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제