golang fifo缓冲频道

Ami*_*ani -1 channel fifo go

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

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

所以,是的,我正在寻找实现这种行为的第三方库.
对不起,不清楚.

nus*_*tin 8

Go中的缓冲通道始终为FIFO.规范明确指出:

频道充当先进先出队列.

如果来自通道的值不是FIFO,则这是通道实现中的错误.

以下代码应始终以正确的顺序打印1,2,3,4:

package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan int, 3)
    ch <- 1
    ch <- 2
    ch <- 3

    go func() {
        ch <- 4
    }()

    time.Sleep(time.Second)

    for i := 0; i < 4; i++ {
        fmt.Println(<-ch)
    }
}
Run Code Online (Sandbox Code Playgroud)

游乐场链接

请注意,当有多个并发发件人时,没有担保人会先发送哪个值.如果有多个等待发送者并且有人从通道缓冲区中删除了一个元素(或者在无缓冲通道的情况下,尝试从通道接收),则运行时将随机选择一个发送goroutine.

例:

package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan int, 2)
    ch <- 1

    go func() {
        ch <- 2
    }()

    go func() {
        ch <- 3
    }()

    time.Sleep(time.Second)

    for i := 0; i < 3; i++ {
        fmt.Println(<-ch)
    }
}
Run Code Online (Sandbox Code Playgroud)

游乐场链接

如果多次运行此代码,您可以看到输出有时可能是1,2,3或1,3,2.(这在操场上不起作用,因为输出被缓存)

  • @ user3142398如果你想要这个,你必须自己实现它.我不知道有任何这样做的包.您可以使用带有递增计数器的队列和条件变量进行发送,但它可能效率不高. (2认同)