Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >通道何时会阻塞goroutine

通道何时会阻塞goroutine
EN

Stack Overflow用户
提问于 2019-06-21 15:38:47
回答 1查看 1.5K关注 0票数 1

如果我定义了一个没有缓冲区的通道,并将一个数据写入其中,它是立即阻塞(这样内核将寻找另一个未阻塞的goroutine,从该通道读取数据),还是继续执行,并在下一次某些代码再次尝试写入通道时阻塞(当它还没有被读取时)?

下面是我用来研究这个问题的两段代码。

code1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import "fmt"

func main() {
    c := make(chan int)
    go func() {
        for i := 0;i < 3; i++ {
            c <- i
            fmt.Printf("number %v inserted into channel\n", i)
        }
    }()
    for i := 0; i < 3; i++ {
        fmt.Printf("number poped from channel %v\n", <-c)
    }
}

输出如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
number 0 inserted into channel
number poped from channel 0
number poped from channel 1
number 1 inserted into channel
number 2 inserted into channel
number poped from channel 2

在第一次写入c之后,这个goroutine似乎会继续执行,因为"number 0 inserted into channel“已经打印出来了。

code2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import "fmt"

func main() {
    c := make(chan int)
    c <- 2
    fmt.Println("Something is written into channel")
    <-c
}

这段代码无法正确运行,因为在运行时会报告死锁错误。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fatal error: all goroutines are asleep - deadlock!

在我看来,当c <-2被执行时,goroutine被阻塞(如果它没有被阻塞,fmt.Println行将被执行,继续执行将在<-c处解锁c)。当这个goroutine被阻塞时,内核会搜索其他goroutine,但是没有找到,所以它会报告一个死锁错误。

总而言之,在第一段代码中,我得出结论,写入通道不会立即阻塞goroutine,但从第二段代码开始会阻塞goroutine。我哪里搞错了,什么时候通道阻塞了goroutine?

EN

回答 1

Stack Overflow用户

发布于 2019-06-21 15:40:30

发送到没有可用缓冲区空间的通道会阻止发送方,直到发送可以完成;从没有可用消息的通道接收会阻止接收方,直到接收可以完成。未缓冲的通道永远不会有缓冲空间--在接收到数据之前发送数据块,反之亦然。这在Go之旅中有所介绍:https://tour.golang.org/concurrency/2

请记住,您的代码是并发的,因此您不能从输出语句的顺序中读取太多内容。在发送/接收操作之间以及将消息打印到stdout时,可以将goroutine置于睡眠状态。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56706566

复制
相关文章
Spring中的AOP——在Advice方法中获取目标方法的参数
访问目标方法最简单的做法是定义增强处理方法时,将第一个参数定义为JoinPoint类型,当该增强处理方法被调用时,该JoinPoint参数就代表了织入增强处理的连接点。JoinPoint里包含了如下几个常用的方法:
林老师带你学编程
2019/05/25
6.2K0
Kotlin在协程中使用Select表达式选择最快结果
Kotlin在1.6时增加了Select的表达式,可以同时等待多个挂起函数,并选择第一个可用的。其实就是说在并行的运算中,直接返回最快的结果。
Vaccae
2022/12/29
6480
Kotlin在协程中使用Select表达式选择最快结果
Java中判断平年闰年最快方法
使用isLeap ,如果为true,那么是闰年,否则为平年 . isLeap需要Year来使用 import java.time.Year; public class Test { public static void main(String[] args) { Year year = Year.of(2000); System.out.println(year.isLeap()); } }
CaesarChang张旭
2021/03/07
1K0
最快速获取全国及全球省市区信息的方法。
最近需要做一个省市区选择的功能,突然想起之前在哪里看见过qq这个工具免费给我提供了文件的。可是想不起来在哪里,在网上找了下相关文章,似乎没有合适的,然后凭着记忆力去qq的安装路径下找了下,终于找到了。
易兒善
2018/08/21
1.2K0
最快速获取全国及全球省市区信息的方法。
在机器学习中处理大量数据!
知乎 | https://zhuanlan.zhihu.com/p/357361005
Datawhale
2021/03/26
2.3K0
在机器学习中处理大量数据!
getBoundingClientRect方法获取元素在页面中的相对位置
获取元素位置可以用 offset 或 getBoundingClientRect,使用 offset 因为兼容性不好,比较麻烦,offset获取位置会形成“回溯”。而 getBoundingClientRect 方法则 兼容性较好,基本所有的浏览器都支持了,且使用起来更容易和简单。
用户6167509
2019/09/04
3.9K0
mysql 获取分组中最新记录SQL写法示例 select group by order by
and it is producing the correct results however they are not in the correct order.
一个会写诗的程序员
2020/05/18
2.6K0
BeautifulSoup解析库select方法实例——获取企业信息
本文内容由浙江浦江中学方春林老师提供。 Requests 是用Python语言编写,基于urllib,采用Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以
Python小屋屋主
2018/04/16
8670
BeautifulSoup解析库select方法实例——获取企业信息
最快的 Hexo 博客搭建方法
使用 Cloud Studio ,就不需要再折腾 Hexo 环境,不需要再解决不同平台上的各种冲突,直接在 Cloud Studio 里面即可进行 Hexo 的写作和部署。
腾讯云 CODING
2019/09/16
1.2K0
最快的 Hexo 博客搭建方法
记录GOPATH在GOLAND中的坑
这里的GOPATH已经出错了,所以编译找不到,我检查了go env也是正确的GOPATH....
超蛋lhy
2018/08/31
1.8K0
记录GOPATH在GOLAND中的坑
[cloc]在Windows中配置cloc的记录
https://github.com/AlDanial/cloc/releases
逝水经年
2022/03/14
2.9K0
js:如何获取select选中的值
<select id=”select”> <option value=”A” url=”http://www.baidu.com”>第一个option</option> <option value=”B” url=”http://www.qq.com”>第二个option</option> </select> 一:JavaScript原生的方法
全栈程序员站长
2022/11/04
26.8K0
最快的 Hexo 博客搭建方法
使用 Cloud Studio ,就不需要再折腾 Hexo 环境,不需要再解决不同平台上的各种冲突,直接在 Cloud Studio 里面即可进行 Hexo 的写作和部署。
全栈程序员站长
2022/06/29
7880
最快的 Hexo 博客搭建方法
vue中同时获取select下拉框的值和文本
在下是首席架构师
2023/07/04
1.9K0
vue中同时获取select下拉框的值和文本
antd的select 的key 和value获取
*默认情况下 onChange 里只能拿到 value,如果需要拿到选中的节点文本 label,可以使用 labelInValue 属性。 选中项的 label 会被包装到 value 中传递给 onChange 等函数,此时 value 是一个对象
用户4344670
2020/02/13
10.3K0
antd的select 的key 和value获取
Hive中SELECT TOP N的方法(order by与sort by)
版权声明:本文为博主-姜兴琪原创文章,未经博主允许不得转载。 https://blog.csdn.net/jxq0816/article/details/87784068
week
2019/03/14
3.9K0
OrientDB显示记录SELECT命令的基本语法
在检索记录时,我们有不同的查询变体或选项以及select语句,以下语句是SELECT命令的基本语法。
用户4988376
2021/08/13
1.2K0
laravel-admin select、multipleSelect从api中获取选项列表
select、multipleSelect从api中获取选项列表 $form->select($column[, $label])->options([1 => 'foo', 2 => 'bar', 'val' => 'Option name']); 或者从api中获取选项列表: $form->select($column[, $label])->options('/api/users'); 其中api接口的格式必须为下面格式: [ { "id": 9, "tex
友儿
2022/09/11
3.8K0
vue中获取外网IP的方法
之前有篇文章js获取客户端真实IP记录了如何获取外网IP 那个只是在普通html页面当中的获取方法,在vue项目中就不能这么使用了。
薛定喵君
2020/08/12
6.3K2
点击加载更多

相似问题

在SQL中向表中插入大量记录的最快方法

71

在mysql中获取记录数的最快方法

32

使用MySQL在JDBC中运行大量SELECT查询的最快方法是什么?

137

这是在MySQL中获取记录的最快方法吗

32

使用ActiveRecords和Rails获取大量记录的最快方法(find_each很慢)

31
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文