美文网首页
2020-09-24 无缓冲和有缓冲通道

2020-09-24 无缓冲和有缓冲通道

作者: 终生学习wq | 来源:发表于2020-09-24 11:27 被阅读0次

Go语言的有缓冲channel和无缓冲channel的区别,有一段很常见的代码。

package main

import (
    "sync"
    "time"
)

func main() {
    // 没有缓冲的channel
    c := make(chan string)

    var wg sync.WaitGroup
    wg.Add(2)

    // 直接填充 foo 到 c 里面
    go func() {
        defer wg.Done()
        c <- `foo`
        fmt.Println("填充完毕执行。。。。")
    }()

    // 由于是没有缓冲区的,只有在发送方和接收方都准备就绪的时候通信才能成功
    // 如果通道是无缓冲的,发送者将被阻塞,直到接收者接收到值。
    go func() {
        defer wg.Done()

        time.Sleep(time.Second * 1)
        println(`Message: `+ <-c)
    }()

    wg.Wait()
}

这里程序的执行结果是,可以看到channel的阻塞

Message: foo
填充完毕执行。。。。

我们再看一下有缓冲区程序的输出

package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    c := make(chan string, 2)

    var wg sync.WaitGroup
    wg.Add(2)

    go func() {
        defer wg.Done()

        c <- `foo`
        fmt.Println("111")
        c <- `bar`
        fmt.Println("222")
    }()

    go func() {
        defer wg.Done()

        time.Sleep(time.Second * 1)
        println(`Message: `+ <-c)
        println(`Message: `+ <-c)
    }()

    wg.Wait()
}
111
222
Message: foo
Message: bar

有一个很形象的图片描述这个样子


1600917874107.jpg

这里只是一些浅显的理解。

相关文章

  • 2020-09-24 无缓冲和有缓冲通道

    Go语言的有缓冲channel和无缓冲channel的区别,有一段很常见的代码。 这里程序的执行结果是,可以看到c...

  • golang - channel(通道)

    1、声明 2、操作 发送 <- : 将数据发送到通道中 接收 <- :从一个通道中接收值 关闭 3、无缓冲和...

  • 2019-06-01

    Tags: channel [单选题]关于无缓冲和有缓冲的channel,下面说法正确的是()A无缓冲的chann...

  • 第一个goroutine + channel 程序

    无缓冲通道TODO: ...... 有缓冲通道TODO: ...... channel 模拟 生产者和消费者 Ti...

  • channel详解

    无缓冲通道 只有当读写都准备好时才不会被阻塞 输出: 有缓冲通道 当有缓冲通道长度未满时,写入是无阻塞的 输出: ...

  • Golang并发:无阻塞通道读写

    阻塞场景无论是有缓存通道、无缓冲通道都存在阻塞的情况。无缓冲通道的特点是,发送的数据需要被读取后,发送才会完成,它...

  • 服务注册与发现之ETCD

    [TOC] 服务注册与发现之ETCD 我们一起来回顾一下上次的分享: 通道是什么,通道的种类 无缓冲,有缓冲,单向...

  • Golang通道的无阻塞读写

    无论是无缓冲通道,还是有缓冲通道,都存在阻塞的情况,但其实有些情况,我们并不想读数据或者写数据阻塞在那里,有1个唯...

  • Golang通道的无阻塞读写的方法示例

    无论是无缓冲通道,还是有缓冲通道,都存在阻塞的情况,但其实有些情况,我们并不想读数据或者写数据阻塞在那里,有1个唯...

  • Go管道初识

    Go管道初识 Go管道基础知识 管道分类 无缓冲(unbuffered channel)无缓冲的通道是指在接收前没...

网友评论

      本文标题:2020-09-24 无缓冲和有缓冲通道

      本文链接:https://www.haomeiwen.com/subject/kcszyktx.html