猿问

golang fifo 缓冲通道

据我了解:当通道已满时,GO 中的缓冲通道不是 FIFO。
我在我的应用程序中需要这种行为(FIFO 行为)。
我怎样才能实现这种行为?有什么开源的吗?
提前致谢

编辑:
有些人不喜欢这个问题,所以让我更清楚一点:
我的意思是,当缓冲通道已满并且多个发送者
在尝试将项目添加到通道时被阻止时,它们将被释放的顺序
不是 FIFO。您还可以阅读此讨论:https : //github.com/golang/go/issues/11506

所以,是的,我一直在寻找实现该行为的第三方库。
抱歉不清楚。


catspeake
浏览 202回答 2
2回答

倚天杖

Go 中的缓冲通道始终是 FIFO。规范清楚地说:通道充当先进先出队列。如果来自通道的值不是 FIFO,那么这是通道实现中的错误。以下代码应始终按正确顺序打印 1、2、3、4:package mainimport (&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "time")func main() {&nbsp; &nbsp; ch := make(chan int, 3)&nbsp; &nbsp; ch <- 1&nbsp; &nbsp; ch <- 2&nbsp; &nbsp; ch <- 3&nbsp; &nbsp; go func() {&nbsp; &nbsp; &nbsp; &nbsp; ch <- 4&nbsp; &nbsp; }()&nbsp; &nbsp; time.Sleep(time.Second)&nbsp; &nbsp; for i := 0; i < 4; i++ {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(<-ch)&nbsp; &nbsp; }}请注意,当有多个并发发送者时,不保证先发送哪个值。如果有多个等待发送者并且有人从通道缓冲区中删除了一个元素(或者在无缓冲通道的情况下,尝试从通道接收),运行时将随机选择一个发送 goroutine。例子:package mainimport (&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "time")func main() {&nbsp; &nbsp; ch := make(chan int, 2)&nbsp; &nbsp; ch <- 1&nbsp; &nbsp; go func() {&nbsp; &nbsp; &nbsp; &nbsp; ch <- 2&nbsp; &nbsp; }()&nbsp; &nbsp; go func() {&nbsp; &nbsp; &nbsp; &nbsp; ch <- 3&nbsp; &nbsp; }()&nbsp; &nbsp; time.Sleep(time.Second)&nbsp; &nbsp; for i := 0; i < 3; i++ {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(<-ch)&nbsp; &nbsp; }}如果您多次运行此代码,您会看到输出有时为 1、2、3 或 1、3、2。(这在操场上不起作用,因为输出已缓存)

慕的地6264312

您可以使用链接列表。container/list 包 ( https://golang.org/pkg/container/ ) 实现了一个可以用作队列的双向链表。也许,它还实现了 Heap,它允许您创建具有优先级的队列。总之,最简单的方法是链表 IHMO:queue := list.New()queue.PushBack("Hello ") // Enqueuequeue.PushBack("world!")for queue.Len() > 0 {&nbsp; &nbsp; e := queue.Front() // First element&nbsp; &nbsp; fmt.Print(e.Value)&nbsp; &nbsp; queue.Remove(e) // Dequeue}
随时随地看视频慕课网APP

相关分类

Go
我要回答