chan是严格的先进先出吗?我可以借助chan实现队列吗?

来源:19-2 课程总结

脑子笨学不会

2019-04-06

我想直接用chan来实现一个队列,带push和pop功能

写回答

1回答

ccmouse

2019-04-07

一个不带buffer的channel一次只能传递一个数据,当然从发送方和接收方来看,的确是“先进先出”的行为,只不过会阻塞。

带buffer的channel(我在channle那章有说到)是真的先进先出,而且下面的buffer满之前不会阻塞。

那么最后,其实我们还是不要用chan来当队列用,原因就是会阻塞,即使有buffer也只是减缓了阻塞的发生。可以参考一下我的实战代码,https://git.imooc.com/coding-180/coding-180/src/master/crawler/scheduler/queued.go#L23

及时的从chan收数据,减小阻塞,随后放到由slice来实现的队列里。


0
1
脑子笨学不会
已经预定义了一个有buffer的chan,向chan中发送数据,然后再次给这个chan来make更大的空间,之前chan中的数据会全部丢失对吗? 有什么办吧能在不丢失之前数据的前提下扩展chan的buffer大小? 如果能保证带buffer的chan不被装满阻塞,就完全可以用chan来当队列吗?
2019-04-07
共1条回复

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程