今天,我们将继续我们的并发设计模式网络系列,在此博客中,我们将了解无聊的设计模式。如果您想通过最新视频进行更新,请订阅我的YouTube频道(这激发了我为社区制作更多此类视频)。
频道链接:https://www.youtube.com/@codepiper
无聊的模式视频链接:https://www.youtube.com/watch?v=RidHWJCveLw
让我们首先看看我们可以在哪里应用这种模式,以及该模式的用例是什么:
- 小而独立的任务:无聊的设计模式非常适合您拥有几个可以同时执行的小型和独立任务的场景。每个任务都可以封装在单独的goroutine中。
- i/o-bound Operations :对于涉及I/O-Bound操作的应用程序(例如,阅读和写作对文件,制作网络请求),无聊的设计模式可能是有益的。同时使用Goroutines和频道执行I/O结合任务可以改善整体吞吐量和性能。
- 事件处理:处理事件或事件驱动的编程时,可以使用无聊的设计模式同时处理多个事件。每个事件处理程序都可以在自己的goroutine中运行,以响应事件发生。
现在,我们将看到如何在goroutine
和waitgroups
的帮助下实现此模式
package main
import (
"fmt"
"sync"
)
// Boring function that returns a channel to send boring messages
func boring(msg string) <-chan string {
ch := make(chan string)
go func() {
defer close(ch) // Close the channel when the goroutine exits
for i := 1; i <= 5; i++ {
ch <- fmt.Sprintf("%s: %d", msg, i)
}
}()
return ch
}
func main() {
aliceCh := boring("Alice")
bobCh := boring("Bob")
// Receive messages concurrently
var wg sync.WaitGroup
wg.Add(2)
go func() {
for msg := range aliceCh {
fmt.Println(msg)
}
wg.Done()
}()
go func() {
for msg := range bobCh {
fmt.Println(msg)
}
wg.Done()
}()
wg.Wait()
}
github链接相同的代码:https://github.com/arshad404/CodePiper/tree/main/GO/concurrency-patterns/Boring