ホームページ  >  記事  >  バックエンド開発  >  Go チャネルは Python ジェネレーターを模倣できますか?

Go チャネルは Python ジェネレーターを模倣できますか?

DDD
DDDオリジナル
2024-11-12 11:56:02271ブラウズ

Can Go Channels Mimic Python Generators?

Go の Python スタイル ジェネレーター

Go では、ツアーの質問 66 で例示されているように、ゴルーチンを 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. ゴルーチンがガベージ コレクションされない場合、メモリ リークが発生します。提供されたコードでは、フィボナッチ ゴルーチンが無期限に存続し、チャネル 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。