Go のゴルーチンはどのようにして Python のジェネレーターを模倣できるのでしょうか?

Mary-Kate Olsen
リリース: 2024-11-09 15:30:02
オリジナル
801 人が閲覧しました

How Can Go's Goroutines Mimic Python's Generators?

Go のジェネレーター: Python 的アプローチ

Tour of Go の質問 66 では、強力な同時実行メカニズムとしてゴルーチンが紹介されています。ただし、Python のジェネレーターを模倣することもできます。

ゴルーチンを使用した次のフィボナッチ ジェネレーターの実装を考えてみましょう:

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)
    }
}
ログイン後にコピー

質問と回答

  • バッファの増加サイズ: バッファー サイズを増やすと、プロデューサー (フィボナッチ ゴルーチン) が一度に複数の値を送信できるようになります。これにより、コンテキストの切り替えが減り、実際にパフォーマンスが向上します。
  • メモリ管理: フィボナッチ ゴルーチンは、チャネルを開いたまま無期限に実行し続けます。メインのゴルーチンが終了すると、チャネルはガベージ コレクションされず、メモリ リークが発生します。

これらの問題を解決するには、より Python 的なアプローチを使用できます。

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 は引数として整数 n を受け取り、チャネルを返します。
  • fib 内で作成されたゴルーチンは、n までのすべてのフィボナッチ数を生成した後、チャネルを閉じます。
  • メインのゴルーチンは、チャネルが閉じるまでチャネルを反復処理します。

このアプローチにより、メモリ リークが防止され、より柔軟なフィボナッチの生成が可能になります。数字。

以上がGo のゴルーチンはどのようにして Python のジェネレーターを模倣できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート