go技术

Go语言(或称为Golang)以其出色的并发模型和简洁的语法结构,吸引了大量的开发者。今天,我们就镜头对准Go语言的并发性进行探讨。

并发(concurrency)和并行(parallelism)是让程序运行更快的两个核心方法。但它们并不是同一种意思。简而言之,”并发”通过分割一个任务成多个可独立运行的子任务,可以将任务在一个时间片中按顺序运行。另一方面,”并行”涉及同时运行多个任务。

Go语言的并发模型基于CSP(Communicating Sequential Processes)理论,它强调的是通过通信来共享内存,而不是通过共享内存来进行通通信。这也就是Go语言中的Goroutine和Channel的由来。

**Goroutines**

Go 使用goroutines来处理并发。goroutines是Go的运行时环境管理的轻量型线程。

要启动一个新的goroutine,我们只需要在函数调用前加上关键字go就可以了。例如:

“`go
go funcName() //启动一个新的goroutine并执行该函数
“`
与传统的线程模型相比,goroutines是非常轻量的,它们的栈内存可以很小(可能只有几KB),并且可以按需扩展。

**Channel**

Channels 是Go中的一个核心特性,它提供了一个连接goroutines的通道,使得一个goroutine可以向另一个goroutine发送数据。

创建channel的方式是:

“`go
ch := make(chan int) //创建一个整型类型的channel
“`

通过channel发送和接收数据:

“`go
ch <- msg //发送msg到channel msg = <- ch //从channel 接收数据并赋值给msg ``` **Select** Go 语言中的 select 语句和 switch 语句类似,但是 select 会随机执行一个可运行的 case。如果没有case可运行,它将阻塞,直到有case可运行。 ```go select { case <-ch1: fmt.Println("Received from ch1") case <-ch2: fmt.Println("Received from ch2") } ``` 为了更好地控制并发,Go 还提供了 sync 包,它提供了基本的同步原元,如互斥锁。 通过深入理解和熟练使用Go的并发性,我们可以写出高效且可伸缩的系统。这也是Golang广受开发者喜爱的原因之一。尽管有许多方面需要进一步学习和实践,但理解了基本的并发性原理和实践将为我们开创无尽的可能性。


已发布

分类

来自

标签:

评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注