>  기사  >  백엔드 개발  >  Go 채널이 Python 생성기를 모방할 수 있나요?

Go 채널이 Python 생성기를 모방할 수 있나요?

DDD
DDD원래의
2024-11-12 11:56:02271검색

Can Go Channels Mimic Python Generators?

Go의 Python 스타일 생성기

Go에서 고루틴은 Python 생성기처럼 활용될 수 있습니다. 가다. 제공된 코드는 간단한 방식으로 질문 66을 다시 작성합니다.

package main

import "fmt"

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)
    }
}

분석

  1. 채널의 버퍼 크기를 늘리면 성능이 향상됩니다. 컨텍스트 전환. 그러나 이로 인해 메모리 사용량이 증가합니다.
  2. 고루틴이 가비지 수집되지 않으면 메모리 누수가 발생합니다. 제공된 코드에서 fibonacci 고루틴은 무기한 지속되어 채널 c가 가비지 수집되는 것을 방지합니다.

대체 접근 방식

이러한 문제를 해결하려면 다음을 고려하세요. 다음 코드:

package main

import "fmt"

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
}

func main() {
    for i := range fib(10) {
        fmt.Println(i)
    }
}

이 예에서:

  • fib 함수는 채널을 반환하여 호출자가 지정된 한도까지 피보나치 수열에 반복적으로 액세스할 수 있도록 합니다.
  • 피보나치 고루틴은 끝에 도달하면 채널을 닫아 메모리 누수가 발생하지 않도록 합니다.

위 내용은 Go 채널이 Python 생성기를 모방할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.