简单队列模型示例

amb*_*air 2 queue multithreading go

是否有一个简单的程序,演示如何在Go中运行队列.我只需要在队列中添加1到10之类的东西,并使用另一个线程并行地从队列中拉出那些.

icz*_*cza 7

并发使用安全的队列基本上是一种语言结构:channel.

通道设计 - 对于并发发送接收是安全的.这是详细说明:如果我正确使用频道,我是否需要使用互斥锁?在其上发送的值按发送顺序接收.

你可以在这里阅读更多关于频道的信息:golang频道用于什么?

一个非常简单的例子:

c := make(chan int, 10) // buffer for 10 elements

// Producer: send elements in a new goroutine
go func() {
    for i := 0; i < 10; i++ {
        c <- i
    }
    close(c)
}()

// Consumer: receive all elements sent on it before it was closed:
for v := range c {
    fmt.Println("Received:", v)
}
Run Code Online (Sandbox Code Playgroud)

输出(在Go Playground上试试):

Received: 0
Received: 1
Received: 2
Received: 3
Received: 4
Received: 5
Received: 6
Received: 7
Received: 8
Received: 9
Run Code Online (Sandbox Code Playgroud)

请注意,通道缓冲区(本例中为10)与要通过它"发送"的元素数无关.缓冲区告诉通道可以"存储"多少元素,换句话说,当没有人从中接收时,可以在没有阻塞的情况下发送多少元素.当通道的缓冲区已满时,进一步的发送将阻塞,直到有人开始从中接收值.