
Golang Goroutines 和 Channels
文章平均质量分 79
gioooo
富士康质检员张全蛋
人生实难,唯有自渡。只有接受了真实现的现状和真实的自己,调整好心态,才能脚踏实地的活着,然后去发现角落处的那些惊喜和美好,去相信一切苦难困境都会过去!“即使身处阴沟,也要记得仰望星空”。
展开
-
Golang goroutine 同步原语:sync 包让你对并发控制得心应手
在 Go 语言中,不仅有 channel 这类比较易用且高级的同步机制,还有 sync.Mutex、sync.WaitGroup 等比较原始的同步机制。通过它们,我们可以更加灵活地控制数据的同步和多协程的并发。原创 2024-04-01 20:40:53 · 1012 阅读 · 0 评论 -
Channel 使用事项和注意细节
说明:如果我们起了一个协程,但是这个协程出现了panic,如果我们没有捕获这个panic,就会造成整个程序崩溃,这时我们可以在goroutine中使用recover来捕获panic,进行处理,这样即使这个协程发生的问题,但是主var mapl map[string]string线程仍然不受影响,可以继续执行。下面是只读,只写管道,可以有效的预防我们误操作。要从管道当中读取数据需要close这个管道,不去close这个管道去遍历的时候,管道会阻塞,如果阻塞在main协程里面会发生死锁。原创 2023-12-31 12:01:54 · 7254 阅读 · 0 评论 -
Golang 协程配合管道
死锁编译器底层会分析,如果发现一个地方在不停的写,但是没有任何一个协程去读取这样就直接死锁,如果有一个协程在慢慢的读取这样不会死锁。和写入读取速度没有关系,但是必须有写入的协程和读取的协程。管道是引用类型,那么写入读取的都是同一个管道,也就是在不同函数不同栈里面读取的都是同一个管道。如果管道和放进去的数据量不匹配,管道的容量小于放进去的数据,又不取出来,那么它就会阻塞,阻塞就会死锁。那么在写的时候就会阻塞,编译器会发现虽然阻塞了,但是有另外一个协程在往里面读取数据,这样就不会发生死锁。原创 2023-12-23 15:42:08 · 3698 阅读 · 0 评论 -
Golang channel 管道关闭close、for...range遍历
使用内置函数close可以关闭channel,当channel关闭后,就不能再向channel写数据了,但是仍然可以从channel中读取数据。下面这种遍历方式肯定是错误的,每次取出来数据长度都会减1,容量方式也一样不是真实的长度,所以只能使用for rang方式。相当于关闭管道就数据不能进入到队列里面了,只能进行读操作,只读不写。2)在遍历时,如果channel已经关闭,则会正常遍历数据,遍历完后,就会退出遍历。1)在遍历时,如果channel没有关闭,则回出现deadlock的错误。原创 2023-12-17 11:24:14 · 4859 阅读 · 0 评论 -
Golang channle (管道)基本介绍、快速入门
为什么需要channel?前面使用全局变量加锁同步来解决goroutine的通讯,但不完美1)主线程在等待所有goroutine全部完成的时间很难确定,我们这里设置10秒,仅仅是估算。2)如果主线程休眠时间长了,会加长等待时间,如果等待时间短了,可能还有goroutine处于工作状态,这时也会随主线程的退出而销毁3)通过全局变量加锁同步来实现通讯,也并不利用多个协程对全局变量的读写操作。4)上面种种分析都在呼唤一个新的通讯机制-channelimport ("fmt""sync"原创 2023-12-06 15:47:52 · 4010 阅读 · 2 评论 -
Golang 设置运行的cpu数与channel管道
介绍:为了充分了利用多cpu的优势,在Golang程序中,设置运行的cpu数目。比如你有逻辑的4个cpu,但是在程序里面只想使用3个。另外一个我要保留下来给其他程序使用,因为你占满了cpu导致其他程序可能跑不起来了。(1)go1.8后,默认让程序运行在多个核上,可以不用设置了(2)go1.8前,还是要设置一下,可以更高效的利益cpu。原创 2023-11-27 19:57:40 · 3935 阅读 · 0 评论 -
Golang 协程、主线程
当执行main的时候就开启了一个主线程,往下执行发现go test(),这样就会开启一个新的分支然后执行,但是主线程并没有阻塞,它会继续往下走,发现for循环去执行,执行完毕主线程就退出。其次就是线程有点笨重,这样就需要在底层做一些优化,这样线程就变的更加轻巧了。1)Go主线程(有程序员直接称为线程/也可以理解成进程):一个Go线程上,可以起多个协程,你可以这样理解,协程是轻量级的线程。开启协程,一般以函数为单位进行开启的.如果不使用go test(),那么就是顺序执行的。优快云 @富士康质检员张全蛋。原创 2023-11-16 11:07:24 · 2934 阅读 · 0 评论 -
Golang GoRoutine MPG 模式浅析
M代表主线程向下执行,p上下文可以根据系统情况开启协程去工作。M可能有很多,可能全部在一个CPU上面,也可能每个M都在各个不同的CPU上面,这样就叫做并行。当有协程被阻塞的时候,它有来回切换的一种机制。可以保证主线程的执行,也能够让排队的G协程得到执行的机会。原创 2023-09-14 19:32:26 · 610 阅读 · 0 评论 -
Golang goroutine 进程、线程、并发、并行 | 线程vs协程
并行:因为是在多个cpu上(比如有10个cpu),比如有10个线程,每个线程执行10毫秒(各自在不同cpu上执行),从人的角度看,这10个线程都在运行,但是从微观上看,在某一个时间点看,也同时有10个线程在执行,这就是并行。并发:因为是在一个cpu上,比如有10个线程,每个线程执行10毫秒(进行轮询操作),从人的角度看,好像这10个线程都在运行,但是从微观上看,在某一个时间点看,其实只有一个线程在执行,这就是并发。2)线程是进程的一个执行实例,是程序执行的最小单元,它是比进程更小的能独立运行的基本单位。原创 2023-09-12 22:50:28 · 516 阅读 · 0 评论 -
Golang 并发、并行和协程
一个应用程序是运行在机器上的一个进程;进程是一个运行在自己内存地址空间里的独立执行体。一个进程由一个或多个操作系统线程组成,这些线程其实是共享同一个内存地址空间的一起工作的执行体。几乎所有’正式’的程序都是多线程的,以便让用户或计算机不必等待,或者能够同时服务多个请求(如 Web 服务器),或增加性能和吞吐量(例如,通过对不同的数据集并行执行代码)。一个并发程序可以在一个处理器或者内核上使用多个线程来执行任务,但是只有同一个程序在某个时间点同时运行在多核或者多处理器上才是真正的并行。转载 2023-02-28 10:50:21 · 684 阅读 · 0 评论 -
Go 同步原语:sync 包让你对并发控制得心应手
channel 为什么是并发安全的呢?是因为 channel 内部使用了互斥锁来保证并发的安全,这节课,我将为你介绍互斥锁的使用。在 Go 语言中,不仅有 channel 这类比较易用且高级的同步机制,还有 sync.Mutex、sync.WaitGroup 等比较原始的同步机制。通过它们,我们可以更加灵活地控制数据的同步和多协程的并发。资源竞争在一个 goroutine 中,如果分配的内存没有被其他 goroutine 访问,只在该 goroutine 中被使用,那么不存在转载 2022-05-05 15:45:53 · 1225 阅读 · 0 评论 -
Golang 并发基础:Goroutines 和 Channels 的声明与使用
前面的课程中,我所写的代码都按照顺序执行,也就是上一句代码执行完,才会执行下一句,这样的代码逻辑简单,也符合我们的阅读习惯。但这样是不够的,因为计算机很强大,如果只让它干完一件事情再干另外一件事情就太浪费了。比如一款音乐软件,使用它听音乐的时候还想让它下载歌曲,同一时刻做了两件事,在编程中,这就是并发,并发可以让你编写的程序在同一时刻做多几件事情。并发和并行。原创 2021-09-07 10:00:35 · 1707 阅读 · 0 评论