【Golang 面试 - 进阶题】每日 3 题(九)

news2024/11/24 13:44:36

 ✍个人博客:Pandaconda-CSDN博客

📣专栏地址:http://t.csdnimg.cn/UWz06

📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

25. G o goroutine 和线程的区别?

Go 的 goroutine 是一种轻量级的协程,与传统的操作系统线程相比,具有以下区别:

1、调度模型

Go 语言中的 goroutine 采用的是 M:N 调度模型,即 M 个 goroutine(协程)映射到 N 个系统线程上,这些线程由 Go 运行时进行调度。而传统的线程则是采用的 1:1 调度模型,即一个线程对应一个系统线程。

2、轻量级

Go 的 goroutine 比传统的线程更加轻量级,创建和销毁 goroutine 的代价比较小,且 goroutine 的初始栈大小只有几 KB,而线程的栈大小通常要大得多。

3、内存占用

由于 goroutine 的内存占用比线程更小,因此在同样的硬件资源下,Go 程序可以运行更多的 goroutine。

4、通信机制

在 Go 中,goroutine 之间的通信使用的是 Channel,Channel 可以避免传统线程中使用锁带来的复杂性和性能损失。

5、错误处理

在传统线程中,如果一个线程抛出异常或崩溃,那么整个进程都会被杀死。而在 Go 中,当一个 goroutine 抛出 panic 时,只有该 goroutine 会被终止,不会影响其他 goroutine 和整个进程。

综上所述,与传统的线程相比,Go 的 goroutine 更加轻量级,占用资源更少,拥有更好的并发性能和更容易处理错误。这也是 Go 语言在并发编程中的优势所在。

26. G o 如何查看正在执行的 goroutine 数量?

程序中引入 pprof pakage

在程序中引入 pprof package:

import _ "net/http/pprof"

程序中开启 HTTP 监听服务:

package main
import (
    "net/http"
    _ "net/http/pprof"
)
func main() {
    for i := 0; i < 100; i++ {
        go func() {
            select {}
        }()
    }
    go func() {
        http.ListenAndServe("localhost:6060", nil)
    }()
    select {}
}

分析 goroutine 文件

在命令行下执行:

go tool pprof -http=:1248 http://127.0.0.1:6060/debug/pprof/goroutine

会自动打开浏览器页面如下图所示:

  

 

在图中可以清晰的看到 goroutine 的数量以及调用关系,可以看到有 103 个 goroutine。

27. G o 如何控制并发的 goroutine 数量?

为什么要控制 goroutine 并发的数量?

在开发过程中,如果不对 goroutine 加以控制而进行滥用的话,可能会导致服务整体崩溃。比如耗尽系统资源导致程序崩溃,或者 CPU 使用率过高导致系统忙不过来。

用什么方法控制 goroutine 并发的数量?

 1. 有缓冲 channel

利用缓冲满时发送阻塞的特性。

package main
import (
    "fmt"
    "runtime"
    "time"
)
var wg = sync.WaitGroup{}
func main() {
    // 模拟用户请求数量
    requestCount := 10
    fmt.Println("goroutine_num", runtime.NumGoroutine())
    // 管道长度即最大并发数
    ch := make(chan bool, 3)
    for i := 0; i < requestCount; i++ {
        wg.Add(1)
        ch <- true
        go Read(ch, i)
    }
     wg.Wait()
}
func Read(ch chan bool, i int) {
    fmt.Printf("goroutine_num: %d, go func: %d", runtime.NumGoroutine(), i)
    <-ch
    wg.Done()
}

输出结果:默认最多不超过 3(4-1)个 goroutine 并发执行。

goroutine_num 1
goroutine_num: 4, go func: 1
goroutine_num: 4, go func: 3
goroutine_num: 4, go func: 2
goroutine_num: 4, go func: 0
goroutine_num: 4, go func: 4
goroutine_num: 4, go func: 5
goroutine_num: 4, go func: 6
goroutine_num: 4, go func: 8
goroutine_num: 4, go func: 9
goroutine_num: 4, go func: 7

2. 无 缓冲 channel

任务发送和执行分离,指定消费者并发协程数。

package main
import (
    "fmt"
    "runtime"
    "sync"
)
var wg = sync.WaitGroup{}
func main() {
    // 模拟用户请求数量
    requestCount := 10
    fmt.Println("goroutine_num", runtime.NumGoroutine())
    ch := make(chan bool)
    for i := 0; i < 3; i++ {
        go Read(ch, i)
    }
    for i := 0; i < requestCount; i++ {
        wg.Add(1)
        ch <- true
    }
    wg.Wait()
}
func Read(ch chan bool, i int) {
    for _ = range ch {
        fmt.Printf("goroutine_num: %d, go func: %d", runtime.NumGoroutine(), i)
        wg.Done()
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1965855.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

搞懂收发模式(Transmit、Receive、IT、DMA、ToIdle、Abort、Callback)

搞懂收发模式&#xff08;Transmit、Receive、IT、DMA、ToIdle、Abort&#xff09; 文章目录 搞懂收发模式&#xff08;Transmit、Receive、IT、DMA、ToIdle、Abort&#xff09;1、阻塞模式&#xff08;阻塞轮询&#xff09;2、非阻塞模式&#xff08; IT &#xff09;3、直接内…

D盘根目录莫名出现 *.scratch 文件夹

不知道从什么时候开始&#xff0c;突然发现D盘根目录出现奇怪的空文件夹&#xff08;图一&#xff09;&#xff0c;一开始因为需求紧张没时间管&#xff0c;但是没几天就发现这个空文件夹越来越多&#xff0c;多到上百个了。 要是几个那还能忍忍&#xff0c;这种程度已经严重影…

IDEA优化配置,提高启动和运行速度

一、修改配置参数 IDEA默认启动配置主要考虑低配置用户&#xff0c;参数不高&#xff0c;导致 启动慢&#xff0c;然后运行也不流畅&#xff0c;这里我们需要优化下启动和运行配置&#xff1b; 找到idea安装的bin目录&#xff1b; 你的按照目录\IntelliJ IDEA 2018.2.2\bin …

客户现场电脑卡死

最近遇到一个很奇怪的现象,客户现场机台运行过程中,出现不规律的卡顿或假死蓝屏情况,软件分析显得异常重要. 首先我们从软件的运行状态,内存,cpu利用率等性能方面排查,通过观察,我们发现内存没有暴涨的情况,cpu利用率也不是很高,表现的现象就是不定时的出现软件假死,卡顿现象.…

SQL插入、更新和删除数据

SQL插入、更新和删除数据 一、直接向表插入数据 1.1、插入完整的行 这里所说的完整行指的是包含表内所有字段的数据行&#xff1b;假设表中有n个字段&#xff0c;则插入完整行的语法&#xff1a; INSERT INTO 表名或视图名 VALUES(字段1的值,字段2的值,字段3的值,...,字段n的…

JSONP跨域

1 概述 定义 json存在的意义&#xff1a; 不同类型的语言&#xff0c;都能识别json JSONP(JSON with Padding)是JSON的一种“使用模式”&#xff0c;可用于解决主流浏览器的跨域数据访问的问题。由于同源策略&#xff0c;一般来说位于 server1.example.com 的网页无法与不是 s…

MCU单片机GPIO初始化该按什么顺序配置?为什么初始化时有电平跳变?

GPIO初始化时有时钟配置、模式配置、输出配置、复用配置&#xff0c;那么在编写初始化代码时&#xff0c;到底该按什么顺序执行呢&#xff1f;如果顺序不当那初始化过程可能会出现短暂的电平跳变。 第一步&#xff0c;初始化MCU外设时&#xff0c;一般都需要先打开对应寄存器的…

Multi-Head Mixture-of-Experts笔记

这篇文章&#xff08;还是校友&#xff09;&#xff0c;也是和dot product本身没什么关系。讲一讲核心思想 文章在背景中介绍了Sparse Mixture of Experts&#xff0c;因为MH-MoE也是在S-MoE基础上做的&#xff0c;个人感觉其实变动并不大&#xff0c;但我觉得写的很清楚&…

优化 Spring Boot 项目启动速度:高效管理大量 Bean 注入

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119@qq.com] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? 专栏导…

卷积神经网络 - 卷积运算篇

序言 在探索深度学习尤其是计算机视觉领域的奥秘时&#xff0c;卷积神经网络&#xff08; Convolutional Neural Networks, CNNs \text{Convolutional Neural Networks, CNNs} Convolutional Neural Networks, CNNs&#xff09;无疑占据了核心地位。而卷积运算&#xff0c;作为…

书生大模型基础岛-第二关:8G 显存玩转书生大模型 Demo

1.来源 https://github.com/InternLM/Tutorial/blob/camp3/docs/L1/Demo/task.md 2.过程 在 /root/share/pre_envs 中配置好了预置环境 icamp3_demo conda activate /root/share/pre_envs/icamp3_demo创建一个目录&#xff0c;用于存放我们的代码。并创建一个 cli_demo.py …

【JVM基础09】——垃圾回收-对象什么时候可以被垃圾回收器回收?

目录 1- 引言&#xff1a;垃圾回收1-1 什么是垃圾回收&#xff1f;(What)1-2 为什么要进行垃圾回收&#xff1f;(Why) 2- ⭐核心&#xff1a;对象什么时候可以被垃圾回收器回收&#xff1f;(How)2-1 对象什么时候可以被回收&#xff1f;2-2 引用计数法引用计数法存在的问题&…

误删文件大救星!4款必备数据恢复软件,轻松恢复各类文档照片

在数字化的时代信息就是王道&#xff0c;很多时候丢失了信息就以为着丢失了资源。这时候就需要失易得数据恢复这样的数据恢复工具来帮我们守护信息的安全。 1.福昕数据恢复 https://www.pdf365.cn/foxit-restore/链接直达&#xff1a;https://www.pdf365.cn/foxit-restore/ …

设计模式-创建型模式-单例设计模式

创建型模式提供创建对象的机制&#xff0c;能够提升已有代码的灵活性和复用性&#xff1b; 常用的有&#xff1a;单例模式、工厂模式、建造设模式&#xff1b;不常用的&#xff1a;原型模式&#xff1b; 1.概述 单例模式是最简单的模式之一&#xff0c;其保证了某个类在运行期…

Ubuntu22 下 Docker 安装,VS Code Docker配置

1. Docker 安装 1. 卸载旧版本的 Docker&#xff08;如果有&#xff09;&#xff1a; sudo apt-get remove docker docker-engine docker.io containerd runc 2. 更新软件包&#xff1a; sudo apt-get update sudo apt-get upgrade 3. 安装 Docker 依赖&#xff1a; sudo apt-…

苹果手机通讯录恢复教程?3招速成指南

随着科技的不断进步&#xff0c;手机丢失、系统崩溃等意外情况也时有发生&#xff0c;一旦这些情况发生&#xff0c;我们宝贵的通讯录资料很可能会付诸东流。对此&#xff0c;本文为广大苹果手机用户提供一份简洁明了的通讯录恢复教程&#xff0c;让你轻松掌握苹果手机通讯录恢…

接了一个2000块的小活,大家进来看看值不值,附源码

如题&#xff0c;上周的一天&#xff0c;朋友圈的一个旧友找到了我&#xff0c;说让我帮他开发一个小工具&#xff0c;虽然活不大&#xff0c;但没个几年的全栈经验还不一定能接下来&#xff0c;因为麻雀虽小&#xff0c;涉及的内容可不少&#xff1a; 需求分析 原型设计 详细…

Halcon 边缘提取(像素)

传统提取边缘的方法即通过图像中的明暗进行过滤&#xff0c;其左右就是根据明暗区域找到像素边界。从数学角度&#xff0c;滤波器决定图像剃度&#xff0c;该图像剃度通常作为边缘幅度和边缘方法返回。通过选取所有边缘幅值高的像素点&#xff0c;可以提取区域间的轮廓。另一个…

G1简介、各种GC总结

概述 G1首次出现是在JDK 6u14版本里作为体验版&#xff0c;JDK 7u4版本被正式推出&#xff0c;JDK 9中被设置为默认垃圾收集器&#xff08;参考JEP 248&#xff09;。 G1全称是Garbage First&#xff0c;目标&#xff1a;延迟可控的情况下&#xff0c;尽可能高的吞吐量。一款…

怎么使用Element ui来做一个前端登录页面

找到Layout 布局 他通过基础的 24 分栏&#xff0c;迅速简便地创建布局。 找一个对齐方式 这个就不错,找到对应的代码 这个 复制进入idea 引入我们的图片和文字 我这里图片有点问题 然后我再添加一条分割线 加入表单校验 把里面的代码同上加入idea 结果 对表单内容进行调整 …