• channels


    channels 是一种 类型 安全的消息队列,充当两个 goroutine 之间的 管道,将通过它同步的进行任意资源的交换。chan 控制goroutines 交互的能力从而创建了 Go 同步机  制。当创建的 chan 没有容量时,称为无缓冲通道。 反过来,使用容量创建的 chan 称为缓冲通道。要了 解通过 chan 交互的 goroutine 的同步行为是什么,我们需要知道通道的   类型和状态。根据我们使用的是无缓冲通道 还是缓冲通道,场景会有所不同,所以让我们单独讨论每个  场景。

    Unbuffered Channelsch := make(chan struct{})无缓冲chan 没有容量,因此进行 任何交 换前需要两个 goroutine 同时准备好。当 goroutine 试图 将一个资源发送到一个无  缓冲的通道并且   没有goroutine 等待接收  该资源时,该通道将 锁住发送goroutine 并使其  等待。当 goroutine 尝试 从无缓冲通道接收 ,并且 没有 goroutine 等待 发送资源时,该通道将锁住接收goroutine 并使其 等待 。无缓冲信道的本质是保证同步。

    Unbuffered Channels第一个 goroutine 在发 送消息foo 之后 被阻塞,因为   还没有接收者准备好。规范中对这种行为进行了很好的解释:https://golang.org/ref/spec#Channel_types“If the capacity is zero or absent, the channel is unbuffered and communication succeeds only when both a sender and receiver are ready.”https://golang.org/doc/effective_go.html#channels“If the channel is unbuffered, the sender blocks until the receiver has received the value”•Receive 先于 Send 发生。•好处: 100% 保证能收到。•代价: 延迟时间未知。

     Buffered Channelsbuffered channel 具有容量,因此其行为可能有点不同。当 goroutine 试图将资源发送到缓冲通道,而该通道已满 时,该通道将锁住goroutine并使其  等待缓冲区可用。如果通道中有空间,发送可以立即进行,goroutine 可以继续 。当goroutine 试图从缓冲通道 接收数据,而 缓冲通道为空时,该通道将锁住goroutine 并使其 等待资源 被发送。

     Latencies due to under-sized buffer我们在 chan 创建过程中定义的缓冲区大小可能会 极大地影响 性能。我将使用密集使用 chan 的扇出模式来查看不同 缓冲区大小的 影响。在我们的 基准测试 中,一个 producer 将在通道中注入百万个整数   元素,而5个 worker 将读取并将它们   追加到一个名为 total 的结果  变量中。•Send 先于 Receive 发生。•好处: 延迟更小。•代价: 不保证数据到达,越大的 buffer,越小的保障到达。buffer = 1 时,给你延迟一个消息的保障。

     

  • 相关阅读:
    Linux 系统内核空间与用户空间通信的实现与分析
    busybox的一些变化
    switch_root 过程错误分析
    2 NICs on same subnet
    qt 维护x86和arm两套编译环境
    init脚本
    硬件测试
    devfs、sysfs、udev介绍
    原创整理:锐捷S3550系列交换机基本配置命令(二)
    【技术贴】red hat 9.0 找不到www.baidu.com.请检查名称并重试 net虚拟机设
  • 原文地址:https://www.cnblogs.com/ithubb/p/14641538.html
Copyright © 2020-2023  润新知