Go의 Python 스타일 생성기
이 질문은 특히 피보나치 수를 생성하는 맥락에서 Go의 고루틴과 Python의 생성기 간의 유사점을 탐구합니다. .
버퍼 크기 영향
Go에서는 채널의 버퍼 크기를 늘리면 실제로 성능이 향상됩니다. 버퍼에 더 많은 값을 저장함으로써 고루틴은 차단 없이 더 빠르게 쓸 수 있으며, 메인 고루틴은 값을 더 효율적으로 사용할 수 있습니다. 그러나 버퍼 크기가 커지면 메모리 소비도 늘어납니다.
가비지 수집 고려 사항
Go의 가비지 수집기는 고루틴을 수집하지 않으므로 제공된 코드에서 시작된 Fibonacci 고루틴은 무한정 계속 실행합니다. 그러나 채널은 가비지 수집되며 Fibonacci 고루틴이 계속 값을 전송하므로 해당 채널은 가비지 수집 대상이 아닙니다.
대체 솔루션
메모리 누수를 방지하려면 , 다음 대체 코드는 Python과 더욱 유사한 생성기 패턴을 구현합니다.
func fib(n int) chan int { c := make(chan int) go func() { x, y := 0, 1 for i := 0; i <= n; i++ { c <- x x, y = y, x+y } close(c) }() return c }
이 버전에서는 Fibonacci 모든 피보나치 수가 생성되면 고루틴이 종료되고 채널이 닫히므로 채널이 소진될 때까지 기본 고루틴이 읽을 수 있습니다.
또는 불확정 생성기의 경우 별도의 종료 채널을 사용하여 신호를 보낼 수 있습니다. 피보나치 고루틴을 중지합니다. 이 방법은 Go 동시성 튜토리얼에 설명되어 있습니다.
위 내용은 고루틴은 피보나치 수 생성을 위한 Python의 생성기 동작을 모방할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!