10.4.2 可缓冲通道

这小节的主题是可缓冲通道。这些通道允许 Go 调度器快速把任务放入队列,为了能够处理更多的请求。而且,您可以使用缓冲通道作为 信号量 来限制整个应用程序。

这里介绍的技术工作如下: 所有进入的请求被转发到通道里,由它来逐个处理。当通道处理完一个请求后,它就发送消息给原来当调用者说它准备处理新当请求了。因此这个通道的缓冲能力限制它能保存的并发请求数。

这个技术用 bufChannel.go 中的代码来帮助介绍,分为四个部分。

bufChannel.go 的第一部分代码如下:

package main

import (
    "fmt"
)

bufChannel.go 的第二部分代码如下:

func main() {
    numbers := make(chan int, 5)
    counter := 10

这个 numbers 通道的定义给它提供了存储五个整数的空间。

bufChannel.go 的第三部分代码显示如下:

    for i:= 0; i < counter; i++ {
        select{
            case numbers <- i:
            default:
                fmt.Println("Not enough space for", i)
        }
    }

上面这段代码里,我们试图放 10 个整数到 numbers 通道。然而,由于 numbers 通道只有 5 个整数的空间,您就不能把 10 个整数都存入进去。

bufChannel.go 的其余代码如下:

上面的代码里,我们试着使用 for 循环和 select 表达式读取 numbers 通道中的内容。只要 numbers 通道里有内容可读,select 表达式的第一个分支就会执行。如果 numbers 通道是空的,这个 default 分支就会执行。

执行 bufChannel.go 产生如下输出:

Last updated

Was this helpful?