Go の Python スタイル ジェネレーター
この質問では、特にフィボナッチ数の生成のコンテキストにおいて、Go のゴルーチンと Python のジェネレーターの類似点を調査します。 .
バッファ サイズ影響
Go では、チャネルのバッファ サイズを増やすと確かにパフォーマンスが向上します。より多くの値をバッファーに保存することで、ゴルーチンはブロックすることなくより高速に書き込むことができ、メインのゴルーチンはより効率的に値を消費できます。ただし、バッファ サイズが大きくなると、メモリ消費量も増加します。
ガベージ コレクションに関する考慮事項
Go のガベージ コレクターはゴルーチンを収集しないため、提供されたコードで起動されるフィボナッチ ゴルーチンは無限に走り続ける。ただし、チャネルはガベージ コレクションされ、フィボナッチ ゴルーチンは値を送信し続けるため、チャネルはガベージ コレクションの対象になりません。
代替ソリューション
メモリ リークを回避するには、次の代替コードは、より Python に似たジェネレーター パターンを実装しています。
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 }
このバージョンでは、すべてのフィボナッチ数が生成され、チャネルが閉じられると、フィボナッチ ゴルーチンは終了し、チャネルが使い果たされるまでメインのゴルーチンが読み取れるようになります。
あるいは、不定ジェネレーターの場合、別の終了チャネルを使用して、フィボナッチゴルーチンに停止の信号を送ります。この方法については、Go 同時実行チュートリアルで説明されています。
以上がゴルーチンはフィボナッチ数生成のために Python のジェネレーター動作を模倣できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。