「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > メモリリークを回避しながらPython スタイルのジェネレーターを Go に実装するにはどうすればよいですか?

メモリリークを回避しながらPython スタイルのジェネレーターを Go に実装するにはどうすればよいですか?

2024 年 11 月 12 日に公開
ブラウズ:254

How to Implement Python-Style Generators in Go While Avoiding Memory Leaks?

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

チャネル バッファーについて

コード内で、チャネル バッファーが増加していることがわかりました。サイズを 1 ~ 10 に設定すると、コンテキストの切り替えが減り、パフォーマンスが向上します。この概念は正しいです。バッファを大きくすると、フィボナッチ ゴルーチンが事前に複数のスポットを埋めることができるため、ゴルーチン間の継続的な通信の必要性が減ります。

チャネルのライフタイムとメモリ管理

ただし、チャネルのライフタイムは、それを使用するゴルーチンとは異なります。元のコードでは、フィボナッチゴルーチンは終了せず、チャネル参照は main 関数に保持されます。そのため、チャネルとそのコンテンツはメモリ内に残り、潜在的なメモリ リークにつながります。

代替ジェネレータの実装

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 

説明:

  • fib 関数は、指定された n 値までのフィボナッチ数列を生成するチャネルを返します。
  • ゴルーチンfib 関数で開始された関数は、シーケンスがなくなるまで常にフィボナッチ数を生成してチャネルに送信します。
  • close(c) ステートメントはシーケンスが完了するとチャネルを閉じ、メイン関数にチャネルが存在しないことを通知します。読み取る要素がさらに増えます。
  • メイン関数で、チャネル上で範囲ベースの for ループを使用すると、チャネルが閉じられるまでその要素が自動的に消費されます。

このアプローチにより、フィボナッチが保証されます。 goroutine は正常に終了し、メモリ リークを防止し、クリーンで効率的なジェネレーターの実装を提供します。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3