首页
Preview

Golang:7个必须了解的并发相关概念

并发是 Go 编程语言的一个重要特性,它使得多个任务能够同时执行。Go 的并发方式独特而强大。轻量级的 goroutine 和 channel 使得高度并发的系统具有可扩展性、安全性和性能表现。

Go 的并发实现

本文将探讨 Go 中并发的七个有趣事实,并附上示例。

1. Goroutine

Goroutine 是 Go 编程语言的一个核心特性。Goroutine 是一种轻量级线程,能够与同一地址空间中的其他 Goroutine 并发运行。它的创建非常便宜,Go 运行时可以同时处理数千个 Goroutine。Goroutine 使编写高度并发的程序变得容易,这些程序可以根据需要进行扩展和缩小。

下面是一个创建 Goroutine 的示例:

Go 中的 Goroutine

在此示例中,我们定义了一个 printMessage 函数,该函数接收一个消息字符串和要打印消息的次数。我们还包含一个 sleep 语句,以模拟每个消息打印之间的一些工作。

main 函数中,我们通过调用 go printMessage("Hello", 5)go printMessage("world", 5) 启动了两个 Goroutine。这创建了两个独立的执行线程,与主线程并发运行。time.Sleep(1 * time.Second) 语句用于暂停主线程一秒钟,这足以让两个 Goroutine 执行并打印它们的消息。

2. Channel

Channel 是 Go 中的另一个核心特性,它使得 Goroutine 之间的通信和同步变得容易。通道是一种类型化的管道,你可以使用 <- 运算符发送和接收值。通道确保并发进程之间的安全和有效通信。

下面是一个使用 Channel 的示例:

Go 中的 Channel

在此示例中,我们使用 make 函数创建了一个类型为 string 的通道。然后,我们创建了一个 Goroutine,使用 <- 运算符将消息“Hello from channel!”发送到通道。最后,我们使用 <- 运算符从通道接收消息并将其打印到控制台。

3. Buffered Channel

Buffered Channel 是一种可以在读取之前保存一定数量的值的 Channel。它们可以用于管理并发系统中的突发活动。使用 make 函数创建 Buffered Channel,第二个参数指定缓冲区大小。

下面是使用 Buffered Channel 的示例:

Go 中的 Buffered Channel

在此示例中,我们创建了一个类型为 int 的 Buffered Channel,缓冲区大小为 2。然后,我们使用 <- 运算符将两个值(12)发送到通道。最后,我们使用 <- 运算符从通道接收值并将其打印到控制台。

4. Select 语句

Go 中的 Select 语句允许你同时等待多个通道操作。它是一个强大的构造,可以帮助你协调复杂的并发系统。Select 语句会阻塞,直到其中一个 case 可以执行,然后执行该 case。

下面是使用 Select 语句的示例:

Go 中的 Select

在此示例中,我们创建了两个通道(ch1ch2)和两个 Goroutine,它们向这些通道发送消息。然后,我们使用 Select 语句等待消息在 ch1ch2 上到达。当消息到达时,我们将其打印到控制台。

5. Mutex

Go 中的 sync.Mutex 类型提供了一种简单而有效的方法来保护共享资源免受并发访问。Mutex 是一种互斥锁,只允许一个 Goroutine 在同一时间访问资源。任何尝试在锁定资源时访问该资源的其他 Goroutine 将被阻塞,直到锁被释放。

下面是使用 Mutex 的示例:

Go 中的 Mutex

在此示例中,我们定义了一个 Counter 类型,该类型具有 count 字段和一个 sync.Mutex 字段。然后,我们在 Counter 类型上定义了两个方法:Increment()Count()。这两个方法都使用 Mutex 来确保只有一个 Goroutine 可以访问 count 字段。最后,我们创建了 1000 个 Goroutine 来递增 count 字段,并在打印最终计数之前等待它们全部完成。

6. WaitGroup

Go 中的 sync.WaitGroup 类型提供了一种简单的方法来同步多个 Goroutine。WaitGroup 等待一组 Goroutine 完成后才继续执行。它是协调多个 Goroutine 执行的有用工具,可以帮助你确保所有 Goroutine 完成后再进入程序的下一步。下面是使用WaitGroup的一个示例:

在这个示例中,我们创建了一个WaitGroup和一个循环,该循环创建了10个goroutine。每个goroutine休眠一定的时间,这个时间由它的索引决定,然后将一条消息打印到控制台。我们使用WaitGroup来确保所有的goroutine在打印最终消息之前都已完成。

7. 上下文

Go语言中的context包提供了一种方法,在API边界和进程之间传递截止时间、取消信号和其他请求范围的值。它是管理并发系统中资源的强大工具,可以帮助你避免常见的问题,比如goroutine泄漏。

下面是使用上下文包的一个示例:

在这个示例中,我们定义了一个worker函数,该函数接受一个context.Context和一个sync.WaitGroup作为参数。worker函数使用select语句等待来自上下文的取消信号或执行某些工作的默认情况。我们还定义了一个main函数,该函数使用context.WithCancel函数创建一个上下文,并启动一个单个worker goroutine。5秒后,我们取消了上下文,这会向worker goroutine发送一个取消信号,导致它停止。我们使用WaitGroup来等待worker goroutine完成后再打印最终消息。

结论

总的来说,并发是Go语言中一个重要的主题,这门语言提供了一套强大的工具来处理并发系统。无论你是在构建一个Web服务器、一个分布式系统还是一个简单的命令行工具,了解Go语言中的并发是构建强大、可扩展和高效的程序所必需的。

版权声明:本文内容由TeHub注册用户自发贡献,版权归原作者所有,TeHub社区不拥有其著作权,亦不承担相应法律责任。 如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

点赞(0)
收藏(0)
菜鸟一只
你就是个黄焖鸡,又黄又闷又垃圾。

评论(0)

添加评论