PHP 편집자 Xigua는 "time.AfterFunc()에 따라 재귀적으로 호출되는 고루틴의 디자인은 매우 나쁘다"라는 문장은 불합리한 디자인 아이디어를 반영한다고 믿습니다. 동시 프로그래밍에서 고루틴을 재귀적으로 호출하면 과도한 리소스 소비가 발생할 수 있으며 심지어 교착 상태 및 메모리 오버플로와 같은 문제가 발생할 수도 있습니다. 따라서 재귀 호출은 주의해서 사용해야 하며, 프로그램의 성능과 안정성을 보장하기 위해서는 문제 해결을 위한 다른 대안을 고려해야 합니다. 코드를 작성할 때 불필요한 문제를 피하기 위해 항상 디자인의 합리성에 주의를 기울여야 합니다.
작은 http 애플리케이션(A)이 있습니다. 시작 시 다른 http 서비스(B)를 호출하여 라이센스를 확인하고 라이센스가 정상이면 http 서버(A)가 시작됩니다. 인증에 실패하면 치명적인 오류가 발생하고 종료됩니다
라이센스 확인은 24시간마다 진행됩니다
24시간마다 새로운 고루틴을 재귀적으로 생성하는 것이 나쁜 디자인으로 간주됩니까? 아래에서 내 코드를 확인하세요. 이전 고루틴이 종료되나요, 아니면 계속 실행되고 n개의 고루틴이 서로 호출하고 종료되나요?
각 새로운 고루틴은 메인 고루틴에서 호출되나요, 아니면 하위 고루틴에서 호출되나요?라이센스 확인 모듈. A 검사 서비스 B
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) }
으아악
기본적으로 이것이 수행하는 작업은 주기적으로 확인하고 문제가 발생하면 컨텍스트나 채널에 알리는 고루틴을 만드는 것입니다.질문을 올바르게 이해했다면 간단하게 설명하면 됩니다. 한 가지 기본 요소는 요청이 실패할 경우 요청을 다시 시도하는 것입니다. 그렇지 않으면 24시간 동안 재시도됩니다. 마지막 계층은 검사가 실패할 경우 이에 반응하는 것입니다. 컨텍스트, 채널 또는 원하는 무엇이든 사용할 수 있습니다
위 내용은 time.AfterFunc()에 의해 재귀적으로 호출되는 고루틴은 제대로 설계되지 않았습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!