Go 学习:并发编程

网站建设4年前发布
31 0 0

20230306005602b56bf7c25cf5f5260665028ebff064edf8104b299,Go 语言在创建之初,CPU 多核发展正猛,Go 语言的创始人果断将面向多核、原生支持并发作为了 Go 语言的设计目标之一,所以在 Go 语言中使用并发有得天独厚的优势。,那么,什么是并发呢?,聊到并发,就会有一系列的其他概念相继而来,比如:并行、进程、线程、异步等。,我们经常使用 C# 的 Winform 程序写一些工具,编译后为一个 exe 文件,文件执行后就会作为一个进程在 Windows 中执行,在之前的单核 CPU 时代,在某个时刻只能执行一个进程对应的程序代码,两个进程不存在并行执行的可能,多个处理器或多核处理器是并行执行的必要条件。,如果对程序进行改造,对执行的任务进行分解,每个分解出来的小的模块由一个单独的线程进行处理,多个线程共享这个进程所拥有的资源,线程作为执行单元可被独立调度到处理器上运行。也许还是执行在单 CPU 中,但是在并发执行的。,Go 语言的创始人 Rob Pike 曾说过:并行关乎执行,并发关乎结构。,举一个生活中的例子:,现在每天都在做的排队做核酸,有三个步骤:,1、排队。,2、扫二维码。,3、捅喉咙。,20230306005603634ffae664324e51bb5895ffdd1efb079b2a15716,
,2023030600581969d8995947cb3240e5f8036da87a5421ec0ed0172,
,由此可见,要发挥并发的作用,离不开线程和多核,线程创建的成本虽然已经比进程小了很多,但依然不适合大规模地创建线程,因为除了每个线程占用的资源外,操作系统调度线程的成本也不小。,因此,Go 语言创造了 goroutine ,也叫协程,这是一个由 Go 运行时负责调度的轻量级线程。和常规的线程相比,有这些好处:,在 Go 中怎样使用 goroutine 呢?非常的简单,使用关键字 go 就可以了,默认情况下,主程序在单独的一个 goroutine 中,如果某个函数或匿名函数使用了 go 关键字,那么就会创建一个单独的 goroutine 。,如果在使用 go 关键字的函数中使用了主程序中的资源,就会出现竞争的情况,看下面的这个例子:,每次运行,counter 的值都会不一样,因为每次不同的协程对公共资源 counter 的抢夺情况不一样,要解决这个问题就要用到锁:,值得注意的是,使用 go 关键字执行的函数即便是有返回值,也会被忽略,如果需要在 goroutine 之间进行通信,需要使用通道。,通道使用 make 进行构建,关键字为 chan 。看下面的例子:,在匿名函数中每隔一秒就给主 gorourine 发送一个消息,主 gorourine 把这个消息打印出来。,最后总结下:,1、并行关乎执行,并发关乎结构。,2、Go 语言的并发是基于轻量级的 goroutine ,相比普通的线程,goroutine 有很多的好处。,3、在不同的 goroutine 之间进行通信需要用到通道,通道使用 make 创建,关键字为 chan 。

© 版权声明

相关文章