Python에서 생성기는 반복자를 생성하기 위한 편리한 구성입니다. Go의 고루틴도 비슷한 기능을 제공합니다. 다음은 피보나치 수열을 위한 Python 스타일 생성기의 Go 구현입니다.
package main import "fmt" // Fibonacci generates the Fibonacci sequence into a channel. func fibonacci(c chan int) { x, y := 1, 1 for { c <- x x, y = y, x+y } } func main() { c := make(chan int) go fibonacci(c) for i := 0; i < 10; i++ { fmt.Println(<-c) } }
버퍼 크기:
증가 채널의 버퍼 크기(예: 10)는 컨텍스트 전환을 줄여 성능을 향상시킬 가능성이 높습니다. 그러나 이로 인해 메모리 소비가 발생합니다.
메모리 관리:
위 코드에서 fibonacci 고루틴은 무기한 실행되며 채널 c에서 읽기를 기다립니다. . 채널 c가 닫혀 있지 않아 메모리 누수가 발생합니다. 다음은 이 문제를 해결하는 대체 구현입니다.
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 }
이 경우 n 피보나치 수열이 생성되면 goroutine이 종료됩니다. 채널이 닫혀서 가비지 수집기에 의해 정리됩니다.
생성된 값의 수를 알 수 없는 시나리오의 경우 별도의 종료 채널을 사용하여 생성기 고루틴에 신호를 보내는 것을 고려하세요. 멈출 때. 이는 Golang 튜토리얼(https://tour.golang.org/concurrency/4)에 설명되어 있습니다.
위 내용은 Go에서 Python 스타일 생성기를 어떻게 구현할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!