iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >Go 的 Buffered Channel 的阻塞机制
  • 673
分享到

Go 的 Buffered Channel 的阻塞机制

go语言 2024-02-10 15:02:01 673人浏览 泡泡鱼
摘要

在Go语言中,有一种特殊的通道类型叫做Buffered Channel(缓冲通道),它在通道中储存一定数量的元素。当通道中的元素数量达到设定的上限时,写入操作会被阻塞住,直到有其他协程

Go语言中,有一种特殊的通道类型叫做Buffered Channel(缓冲通道),它在通道中储存一定数量的元素。当通道中的元素数量达到设定的上限时,写入操作会被阻塞住,直到有其他协程从通道中读取元素。相反,当通道中的元素数量为零时,读取操作也会被阻塞住,直到有其他协程向通道中写入元素。这种阻塞机制可以有效地控制协程之间的同步和通信。在本文中,我们将详细介绍Go语言中Buffered Channel的阻塞机制。

问题内容

在《Tour of Go》中,示例代码是这样给出的:

package main

import "fmt"

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

它执行良好并打印出来

1
2

此行为与此练习的描述不同,其中指出:


Sends to a buffered channel block only when the buffer is full. Receives block when the buffer is empty

ch <- 2 行之后,ch is 已满,并且由于我们只运行 1 个单独的 Goroutine,即主 Goroutine,因此该 Goroutine 应该被阻塞,直到 ch is 被接收者消耗,因此代码不应该到达fmt.Println(<-ch) 行,但应该说类似


fatal error: all goroutines are asleep - deadlock!

但是,由于情况并非如此,我很困惑,并寻求指导。

这是我写的另一段代码

chh := make(chan int, 2)

go func() {
    chh <- 1
    fmt.Printf("chh after 1: %v, %v\n", cap(chh), len(chh))
    chh <- 2
    fmt.Printf("chh after 2: %v, %v\n", cap(chh), len(chh))
    chh <- 3
    fmt.Printf("chh after 3: %v, %v\n", cap(chh), len(chh))
}()

fmt.Println(<-chh)
fmt.Println(<-chh)
fmt.Println(<-chh)

执行结果为

1
chh after 1: 2, 0
chh after 2: 2, 0
chh after 3: 2, 1
2
3

这更令人困惑。这次有另一个 goroutine 进行发送。我的期望是,在第一个 fmt.Println( 期间,主 goroutine 应该被阻塞。调度程序将选择运行匿名函数的 goroutine,并且它应该执行到 chh ,然后它会阻塞自身,调度程序再次恢复到主 goroutine。然而,如结果所示,第二个 goroutine 在 chh 之后立即被阻塞。为什么会这样?

编辑: 我仍然不明白为什么我的本地首先打印 1 。当我在远程服务器上尝试使用 go Playground 时,它显示出不同的行为,现在与我的期望一致。

已知channel是由3个队列组成(接收goroutines、发送goroutines ans value buffer),当匿名函数运行时,channel chh的状态为(sending:empty,valuebuffer:empty,receiving:[main] )

正在运行的子 Goroutine 只是将值直接推入主 Goroutine,而没有实际将其传递到值缓冲区。这就是为什么chh推送后1的长度是0

解决方法

该通道可容纳两人。两次发送可以成功而不会阻塞。 第三个​​不能。仅当通道在发送之前已满时,发送才会阻塞。

以上就是Go 的 Buffered Channel 的阻塞机制的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: Go 的 Buffered Channel 的阻塞机制

本文链接: https://www.lsjlt.com/news/563135.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Go 的 Buffered Channel 的阻塞机制
    在Go语言中,有一种特殊的通道类型叫做Buffered Channel(缓冲通道),它在通道中储存一定数量的元素。当通道中的元素数量达到设定的上限时,写入操作会被阻塞住,直到有其他协程...
    99+
    2024-02-10
    go语言
  • 深入探讨Go语言实现阻塞的机制
    Go语言是一种轻量级的并发编程语言,其强大的并发特性使其在处理大规模并发任务时表现出色。在Go语言中,阻塞是一种常见的编程模式,可以通过通道(channel)和goroutine来实现...
    99+
    2024-04-02
  • Golang channel为什么不会阻塞的原因详解
    正文 最近在学通道channel,发现一个简单的demo: package main import "fmt" func main() { chanInt := make(c...
    99+
    2024-04-02
  • Golang协程阻塞机制详解
    go 协程阻塞发生在协程等待事件完成后继续执行时,如等待管道数据、系统调用完成或锁释放。解决方案包括:1. 使用非阻塞 i/o;2. 使用 select 监听多个事件;3. 设置操作超时...
    99+
    2024-04-08
    golang 协程
  • XXL-JOB的阻塞处理策略-单机串行机制
    XXL-JOB的阻塞处理策略-单机串行机制 问题 默认的单机串行策略,是指的是在xxl-job调度时串行,还是指具体的执行器串行 纠结这个问题的起源是在使用xxl-job的时候,配置了两台执...
    99+
    2023-09-12
    服务器 网络 java
  • linux阻塞与非阻塞的概念是什么
    在Linux系统中,阻塞和非阻塞是指对于输入/输出(I/O)操作的处理方式。阻塞(Blocking)是指当程序发起一个I/O操作时,...
    99+
    2023-09-16
    linux
  • Nodejs中阻塞和非阻塞的示例分析
    这篇文章主要介绍了Nodejs中阻塞和非阻塞的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。对于阻塞和非阻塞这两个概念大家应该都有一些自己的理解:再简单说一下,阻塞大...
    99+
    2023-06-15
  • 浅谈Java非阻塞同步机制和CAS
    目录什么是非阻塞同步悲观锁和乐观锁CAS什么是非阻塞同步 非阻塞同步的意思是多个线程在竞争相同的数据时候不会发生阻塞,从而能够在更加细粒度的维度上进行协调,从而极大的减少线程调度的开...
    99+
    2024-04-02
  • JAVA NIO下I/O的阻塞与非阻塞实现
    本篇内容介绍了“JAVA NIO下I/O的阻塞与非阻塞实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!当前环境jdk == 1.8代码地址...
    99+
    2023-06-02
  • Go 中缓冲通道的范围是阻塞的
    php小编鱼仔在Go语言中,缓冲通道是一种强大且灵活的工具。缓冲通道提供了一种在发送和接收数据之间进行同步的机制,可以控制通信的速度和顺序。它的范围是阻塞的,也就是说当通道已满或为空时...
    99+
    2024-02-09
    go语言
  • php程序阻塞与非阻塞的区别有哪些
    本篇内容主要讲解“php程序阻塞与非阻塞的区别有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php程序阻塞与非阻塞的区别有哪些”吧!PHP程序阻塞和非阻塞的区别是:阻塞调用结果返回之前,当...
    99+
    2023-06-29
  • 探索Go语言中阻塞的工作原理
    标题:深入探索Go语言中阻塞的工作原理及具体代码示例 在Go语言的并发模型中,阻塞是一个重要的概念。掌握阻塞的原理对于编写高效的并发程序至关重要。本文将深入探索Go语言中阻塞的工作原理...
    99+
    2024-04-02
  • Python中的同步异步阻塞与非阻塞是什么
    今天小编给大家分享一下Python中的同步异步阻塞与非阻塞是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、状态介绍在...
    99+
    2023-07-05
  • Python的condition和阻塞队
    Python的condition和阻塞队列Queue 条件(Condition) 条件同步机制是指:一个线程等待特定条件,而另一个线程发出特定条件满足的信号。 解释条件同步机制的一个很好的例子就是生产者/消费者(producer/...
    99+
    2023-01-31
    Python condition
  • 对于同步、异步、阻塞、非阻塞的几点浅薄理
    首先我们先来看看: 一、同步与异步同步/异步, 它们是消息的通知机制(都是通过状态、通知、回调函数来返回结果)1. 概念解释    同步所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。 (按照这个定义,其实绝大多数...
    99+
    2023-01-30
    几点 浅薄
  • 粘包、阻塞与非阻塞、验证客户端的合法性
    1.1 tcp协议的粘包现象 tcp协议传输数据存在粘包现象,udp协议不存在粘包协议。 1.1.1 什么是粘包现象 1.发生在发送端的粘包 由于两个数据的发送时间间隔短+数据的长度小,所以由tcp协议的优化机制将两条信息作为一条信息...
    99+
    2023-01-31
    与非 客户端 合法性
  • 如何在Redis中实现分布式锁的阻塞等待机制
    在Redis中实现分布式锁的阻塞等待机制可以使用Redis的BLPOP命令和SETNX命令结合实现。下面是一种基本的实现方式: 使...
    99+
    2024-04-09
    Redis
  • 学习Go语言中阻塞的原理与应用
    Go语言是一门由Google开发的开源编程语言,它具有并发编程的优势,其中阻塞是一种常见的编程模式。本文将探讨Go语言中阻塞的原理与应用,并给出具体的代码示例,帮助读者更好地理解和应用...
    99+
    2024-04-02
  • php实现阻塞的方法
    这篇文章主要为大家展示了php实现阻塞的方法,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“php实现阻塞的方法”这篇文章吧。php有什么用php是一个嵌套的缩写名称,指的是英文超级文本预处理语言(...
    99+
    2023-06-06
  • 如何查杀oracle的阻塞
    小编给大家分享一下如何查杀oracle的阻塞,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!执行以下脚本抓目前的阻塞: ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作