城阳网站开发公司,贵阳网站制作系统,网上注册公司的章程怎么下载出来,建设一个看电影的网站✍个人博客#xff1a;Pandaconda-CSDN博客 #x1f4e3;专栏地址#xff1a;http://t.csdnimg.cn/UWz06 #x1f4da;专栏简介#xff1a;在这个专栏中#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话#xff0c;欢迎点赞#x1f44d;收藏… ✍个人博客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 之间的通信使用的是 ChannelChannel 可以避免传统线程中使用锁带来的复杂性和性能损失。
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 (fmtruntimetime
)
var wg sync.WaitGroup{}
func main() {// 模拟用户请求数量requestCount : 10fmt.Println(goroutine_num, runtime.NumGoroutine())// 管道长度即最大并发数ch : make(chan bool, 3)for i : 0; i requestCount; i {wg.Add(1)ch - truego Read(ch, i)}wg.Wait()
}
func Read(ch chan bool, i int) {fmt.Printf(goroutine_num: %d, go func: %d, runtime.NumGoroutine(), i)-chwg.Done()
}
输出结果默认最多不超过 34-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 (fmtruntimesync
)
var wg sync.WaitGroup{}
func main() {// 模拟用户请求数量requestCount : 10fmt.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()}
}