首頁 >後端開發 >Golang >Go 的 Goroutines 如何模仿 Python 的生成器?

Go 的 Goroutines 如何模仿 Python 的生成器?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-09 15:30:02813瀏覽

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

Go 中的生成器:Pythonic 方法

在 Go 之旅中,問題 66 引入了 Goroutines 作為強大的並發機制。但它們也可以模仿 Python 的生成器。

考慮以下使用goroutine 實現的斐波那契產生器:

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

問題與解答

  • 緩衝區大小:增加緩衝區大小允許生產者(斐波那契goroutine)一次發送多個值。這確實可以透過減少上下文切換來提高效能。
  • 記憶體管理:斐波那契 goroutine 將無限期地繼續運行,保持通道開啟。當主 goroutine 退出時,通道不會被垃圾回收,從而導致記憶體洩漏。

要克服這些問題,可以使用更Pythonic 的方法:

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 中所建立的 goroutine 在產生所有斐波那契數最多為 n。
  • 主 Goroutine 迭代通道直至關閉。

這種方法可以防止記憶體洩漏,並允許更靈活地產生斐波那契數。

以上是Go 的 Goroutines 如何模仿 Python 的生成器?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn