0
点赞
收藏
分享

微信扫一扫

简单的斐波那契数列通过chan实现生产者消费者模型

1.实现斐波拉契数列

写一个函数返回长度为n的斐波拉契slice数组

func fi(n int) []int {
	if n <= 0 {
		return []int{}
	}
	fibs := make([]int, n)
	fibs[0] = 0
	if n > 1 {
		fibs[1] = 1
		for i := 2; i < n; i++ {
			fibs[i] = fibs[i-1] + fibs[i-2]
		}
	}
	return fibs
}

注意点,

1.make切片的时候长度为n,不要写0

2.初始化fibs[0]分fibs[1]的值

简单的斐波那契数列通过chan实现生产者消费者模型_Group

2.生产者消费者

1.写一个生产者,生产n个斐波那契数列,比如从长度8开始生成10次,也就是生成长度为8, 9, 10,到17的这个n个数列

2.写一个消费者消费生产的n个斐波拉契数列,然后数列的每个值都乘以2,在把乘以2的数列用另外一个消费者打印出来·

分析:

1.生产者1:生成斐波拉契数列

2.消费者1:消费数列 并生成改变值的数列

3.消费者2:消费新的数列

func produce(start, count int, ch chan<- int) {
	defer close(ch)
	for i := 0; i < count; i++ {
		ch <- start + i
	}
}

func consumeAndProduce(ch <-chan int, fibChan chan<- []int) {
	defer close(fibChan)
	for n := range ch {
		fibChan <- fi(n)
	}
}

func consumer(fibChan <-chan []int, wg *sync.WaitGroup) {
	defer wg.Done()
	for fibSlice := range fibChan {
		doubleSlice := make([]int, len(fibSlice))
		for i, v := range fibSlice {
			doubleSlice[i] = v * 2
		}
		fmt.Println(doubleSlice)
	}
}

简单的斐波那契数列通过chan实现生产者消费者模型_Group_02

注意关闭chan,不然一直消费者一直读不到数据会死锁

简单的斐波那契数列通过chan实现生产者消费者模型_斐波拉契数列_03

       3.主函数


func main() {
	var wg sync.WaitGroup
	ch := make(chan int)
	fibCh := make(chan []int)
	wg.Add(1)
	go produce(8, 15, ch)
	go consumeAndProduce(ch, fibCh)
	go consumer(fibCh, &wg)
	wg.Wait()
}

正确运行

简单的斐波那契数列通过chan实现生产者消费者模型_Group_04

4.总结

本案例主要学习了斐波那契数列是什么,以及如何运用chan实现生产者消费者模型,简单的例子大大的学问,希望看过这篇文章的人对chan有了更深的理解,也祝大家2024新年愉快

举报

相关推荐

0 条评论