首页  >  文章  >  后端开发  >  Go 的 Goroutines 如何模仿 Python 的生成器?

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

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-09 15:30:02778浏览

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