我目前正在浏览Go,并且认为goroutines的用法类似于Python生成器,尤其是Question
66
。我以为66看起来很复杂,因此我将其改写为:
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)
}
}
这似乎有效。几个问题:
fibonacci
则将尽快填充另外10个点,并且main
会尽快耗尽这些点。这是正确的吗?这会比内存大小为1的缓冲区更好,但是会占用内存,对吗?fibonacci
发送方关闭,因此当我们超出范围时在内存方面会发生什么?我的期望是,一旦c
和go fibonacci
是范围,渠道和东西展现出来就可以得到垃圾收集。我的直觉告诉我,这可能不会发生。我喜欢@
tux21b的答案;在fib()
函数中创建通道可以使调用代码清晰美观。详细说明一下,如果在调用时无法告诉函数何时停止,则只需要一个单独的“退出”通道。如果您只关心“最多X个数字”,则可以执行以下操作:
package main
import "fmt"
func fib(n int) chan int {
c := make(chan int)
go func() {
x, y := 0, 1
for x < n {
c <- x
x, y = y, x+y
}
close(c)
}()
return c
}
func main() {
// Print the Fibonacci numbers less than 500
for i := range fib(500) {
fmt.Println(i)
}
}
如果您想要执行任何一项操作,这有点草率,但是我个人比较喜欢测试呼叫者中的条件,然后通过单独的通道发出退出信号:
func fib(wanted func (int, int) bool) chan int {
c := make(chan int)
go func() {
x, y := 0, 1
for i := 0; wanted(i, x); i++{
c <- x
x, y = y, x+y
}
close(c)
}()
return c
}
func main() {
// Print the first 10 Fibonacci numbers
for n := range fib(func(i, x int) bool { return i < 10 }) {
fmt.Println(n)
}
// Print the Fibonacci numbers less than 500
for n := range fib(func(i, x int) bool { return x < 500 }) {
fmt.Println(n)
}
}
我认为这是否取决于给定情况的具体情况:
总结并实际回答您的问题:
由于上下文切换较少,因此增加通道大小将有助于提高性能。在这个简单的示例中,性能和内存消耗都不会成为问题,但是在其他情况下,缓冲通道通常是一个很好的主意。make (chan int, 100)
在大多数情况下,使用的内存似乎并不重要,但是很容易造成很大的性能差异。
您的fibonacci
函数中有一个无限循环,因此运行它的goroutine将永远运行(c <- x
在本例中为on )。您(一旦c
超出了调用者的范围)就不会再从与之共享的频道中读取该事实并不会改变这一点。正如@ tux21b所指出的,该通道将永远不会被垃圾回收,因为它仍在使用中。这与关闭通道无关(其目的是让通道的接收端知道不再有值了),并且与不从函数中返回无关。
本文向大家介绍python 中的列表生成式、生成器表达式、模块导入,包括了python 中的列表生成式、生成器表达式、模块导入的使用技巧和注意事项,需要的朋友参考一下 5.16 列表生成式 5.17 列表生成式与生成器表达式的应用 第六章模块 什么是模块? 模块就是一系统功能的集合体,在python中,一个py文件就是一个模块,比如module.py,其中模块名module 6.1 import
本文向大家介绍浅谈Python中列表生成式和生成器的区别,包括了浅谈Python中列表生成式和生成器的区别的使用技巧和注意事项,需要的朋友参考一下 列表生成式语法: 二者的区别很明显: 一个直接返回了表达式的结果列表, 而另一个是一个对象,该对象包含了对表达式结果的计算引用, 通过循环可以直接输出 结果 当表达式的结果数量较少的时候, 使用列表生成式还好, 一旦数量级过大, 那么列表生成式
本文向大家介绍Python中的列表生成式与生成器学习教程,包括了Python中的列表生成式与生成器学习教程的使用技巧和注意事项,需要的朋友参考一下 列表生成式 即创建列表的方式,最笨的方法就是写循环逐个生成,前面也介绍过可以使用range()函数来生成,不过只能生成线性列表,下面看看更为高级的生成方式: 写列表生成式时,把要生成的元素x * x放到前面,后面跟for循环,就可以把list创建出来,
本文向大家介绍python列表生成式与列表生成器的使用,包括了python列表生成式与列表生成器的使用的使用技巧和注意事项,需要的朋友参考一下 列表生成式:会将所有的结果全部计算出来,把结果存放到内存中,如果列表中数据比较多,就会占用过多的内存空间,可能会导致MemoryError内存错误或者导致程序在运行时出现卡顿的情况 列表生成器:会创建一个列表生成器对象,不会一次性的把所有结果都计算出来,如
有没有一个包生成PDF(与样式)从网页与拉维勒。我尝试使用barryvdh/laravel-dompdf,但是PDF没有样式化。Laravel有没有更好的解决方案
问题内容: 我目前正在阅读Python,目前正在研究生成器。我发现很难回头。 从Java的背景出发,是否有Java的等效语言?这本书讲的是“生产者/消费者”,但是当我听说线程的时候。 什么是发电机,为什么要使用它?显然,无需引用任何书籍(除非您可以直接从书籍中找到一个体面,简单的答案)。也许举一些例子,如果您感到慷慨! 问题答案: 注意:本文采用Python 3.x语法。† 一个发电机仅仅是它返回