iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Golang channel为什么不会阻塞的原因详解
  • 122
分享到

Golang channel为什么不会阻塞的原因详解

2024-04-02 19:04:59 122人浏览 泡泡鱼
摘要

正文 最近在学通道channel,发现一个简单的demo: package main import "fmt" func main() { chanInt := make(c

正文

最近在学通道channel,发现一个简单的demo:

package main
import "fmt"
func main() {
    chanInt := make(chan int)
    Go func() {
        chanInt <- 100
    }()
    res := <-chanInt
    fmt.Println(res)
}

输出结果是100,这个没有问题。但是之前在学goroutine的时候有看到过一个例子:

package main
import "fmt"
func hello() {
    fmt.Println("Hello Goroutine!")
}
func main() {
    go hello() // 启动另外一个goroutine去执行hello函数
    fmt.Println("main goroutine done!")
}

这个例子输出的只有:main goroutine done! 并没有Hello Goroutine!

看过解释:在程序启动时,Go程序就会为main()函数创建一个默认的goroutine。当main()函数返回的时候该goroutine就结束了,所有在main()函数中启动的goroutine会一同结束

那么这个解释放到第一个例子为什么不适用了?

ps:我得理解是:运行到res := <-chanInt这句会阻塞,直到协程写入通道后,就马上读取,继续执行打印语句。不知道理解的对不对?

然后就是关于阻塞的情况,比如我把第一个例子改一下:

package main
import (
    "fmt"
    "time"
)
func main() {
    chanInt := make(chan int)
    go func() {
        chanInt &lt;- 100
    }()
    time.Sleep(10 * time.Second)
    res := &lt;-chanInt
    fmt.Println(res)
}

多了time.Sleep(10 * time.Second)等待10秒钟,10秒后输出100,这个没有问题。

然后再看一个例子:

func main() {
    chanInt := make(chan int)
    chanInt &lt;- 100
    res := &lt;-chanInt
    fmt.Println(res)
}

这个例子就会死,阻塞在chanInt <- 100这句,发现没有接收者所以死锁了,这边不理解的是:睡眠10秒的时候,在这10秒里面为什么不会造成死锁?而最后一个例子一运行马上报死锁?更多关于golang channel不会阻塞的资料请关注编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: Golang channel为什么不会阻塞的原因详解

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

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

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

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

下载Word文档
猜你喜欢
  • Golang channel为什么不会阻塞的原因详解
    正文 最近在学通道channel,发现一个简单的demo: package main import "fmt" func main() { chanInt := make(c...
    99+
    2024-04-02
  • Redis的快照为什么不会阻塞其他请求
    今天就跟大家聊聊有关Redis的快照为什么不会阻塞其他请求,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。为什么这么设计(Why's THE ...
    99+
    2024-04-02
  • quartz任务阻塞的原因及解决方法是什么
    在Quartz任务调度中,任务阻塞的原因可能有以下几种:1. 任务执行时间过长:如果一个任务执行时间过长,可能会导致后续任务无法按时...
    99+
    2023-10-20
    quartz
  • 电脑为什么会蓝屏的原因
    电脑蓝屏的原因有很多,以下是一些常见的原因:1. 硬件故障:例如内存模块损坏、硬盘故障、电源问题等。2. 软件冲突:某些软件或驱动程...
    99+
    2023-09-09
    电脑
  • 详解ThreadLocal为什么会内存溢出原理
    目录前言ThreadLocal源码分析ThreadLocal value内存溢出总结前言 关于ThreadLocal (线程本地存储),从字面意思上看主要是存储一些本地变量,使它们...
    99+
    2023-01-04
    ThreadLocal内存溢出 ThreadLocal内存
  • 断电后Redis数据不会丢失的原因是什么
    这篇文章将为大家详细讲解有关断电后Redis数据不会丢失的原因是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言Redis 作为一款内存数据库,被广泛使用于缓存,分布式锁等场景,那么假如断电或者因其...
    99+
    2023-06-20
  • 为什么微软不支持php8背后的原因是什么?
    微软不支持php8的背后原因是什么? 随着PHP 8的发布,许多开发者对于微软不支持这个最新版本的PHP表达了惊讶和疑惑。作为一家技术巨头,微软一直以来都在支持并积极推动开发者生态系统的发展,为什么会选择不支持PHP 8呢? 首...
    99+
    2024-01-26
    微软 PHP 不支持
  • 线程崩溃不会导致JVM崩溃的原因是什么
    本文小编为大家详细介绍“线程崩溃不会导致JVM崩溃的原因是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“线程崩溃不会导致JVM崩溃的原因是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。线程崩溃,进程一定...
    99+
    2023-07-02
  • 解析HTML为什么不支持固定定位?原因探究
    为什么HTML不允许使用固定定位?在HTML中,我们可以使用CSS来控制元素的定位和布局。CSS提供了多种定位方式,包括相对定位、绝对定位和固定定位。然而,HTML规范中并不允许使用固定定位。这是因为固定定位在某些情况下可能导致布局问题和性...
    99+
    2023-12-28
    html 原因分析: 规范性:HTML是一种标记语言 而固定定位是一种CSS属性
  • Golang中乱码的原因及解决方法是什么
    这篇“Golang中乱码的原因及解决方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Golang中乱码的原因及解决方...
    99+
    2023-07-05
  • 详解为什么说Golang中的字符串类型不能修改
    目录字符串定义字符串的组成字符串不能修改字符串的赋值为什么这么设计在接触Go这么语言,可能你经常会听到这样一句话。对于字符串不能修改,可能你很纳闷,日常开发中我们对字符串进行修改也是...
    99+
    2023-03-06
    Golang字符串类型不能修改 Golang字符串类型 Golang字符串
  • golang内存逃逸的原因及解决方法是什么
    在Go语言中,内存逃逸指的是在函数内部分配的变量在函数执行完后仍然被其他部分引用,导致变量逃逸到堆上分配内存,而不是在栈上分配内存。...
    99+
    2023-10-23
    golang
  • golang内存泄漏的原因及解决方法是什么
    Golang中的内存泄漏是指程序中分配的内存没有被适时地释放,导致程序占用的内存逐渐增加,最终耗尽系统内存资源。内存泄漏的原因和解决...
    99+
    2023-10-20
    golang
  • 云解析不成功什么的原因有哪些
    云解析不成功什么的原因有:1.域名记录不存在,权威不存在具体的域名记录;2.权威解析失败;3.拒绝服务,请求源不在递归服务器的服务范围内;具体分析如下:域名记录不存在域名权威服务器及托管的主域名均正常,但是权威并不存在这条具体的域名记录。权...
    99+
    2024-04-02
  • 为什么php文件不能输出结果?原因和解决方案
    作为一门流行的后端编程语言,PHP的应用广泛。然而,有些开发者在编写PHP程序时会遇到一个问题:PHP文件不能输出结果。那么是什么原因导致这种情况的发生呢?本文将为您详细介绍。一、PHP输出的原理在介绍问题原因之前,我们需要了解PHP输出的...
    99+
    2023-05-14
    php
  • 详解Golang Map中的key为什么是无序的
    目录一、为什么是无序的?二、GO 为什么要这么做?三、遍历是否真的无序的1.第一次遍历2.第二次遍历四、如何才能得到有序的键值对总结一、为什么是无序的? 开门见山,先上源码 func...
    99+
    2024-04-02
  • MySQL打不开的原因及解决方法是什么
    MySQL打不开的原因有很多,并且需要根据具体情况来进行排查和解决。以下是一些常见的原因和解决方法: MySQL服务未启动:检查...
    99+
    2024-02-29
    MySQL
  • burpsuite打不开的原因及解决方法是什么
    Burp Suite打不开的原因有很多,可能是由于以下几个常见问题:1. Java环境:Burp Suite是基于Java开发的,如...
    99+
    2023-08-18
    burpsuite
  • crontab不执行的原因和解决方案是什么
    crontab不执行的原因有很多,以下是一些可能的原因和解决方案:1. crontab配置错误:可能是crontab的时间设置有误,...
    99+
    2023-08-12
    crontab
  • React不将Vite作为构建应用的首选原因是什么
    这篇文章主要介绍“React不将Vite作为构建应用的首选原因是什么”,在日常操作中,相信很多人在React不将Vite作为构建应用的首选原因是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”React不将...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作