全国旗舰校区

不同学习城市 同样授课品质

北京

深圳

上海

广州

郑州

大连

武汉

成都

西安

杭州

青岛

重庆

长沙

哈尔滨

南京

太原

沈阳

合肥

贵阳

济南

下一个校区
就在你家门口
+
当前位置:首页  >  技术干货

深入浅出让你真正理解Golang并发模型

发布时间:2023-12-27 16:38:45
发布人:xqq

深入浅出:让你真正理解Golang并发模型

在当今互联网领域,Golang这门语言被越来越多的技术从业者所熟知和使用。Golang作为一门高效、简洁、并发性强的语言,其并发模型在众多编程语言中也很独特。那么,在本文中,我们将深入浅出的讲解Golang并发模型的相关知识点,为大家剖析Golang并发模型的精髓。

1. Golang Goroutine和Channel

Goroutine和Channel是Golang并发模型的两个重要组成部分。Goroutine是一个轻量级的线程,可以让程序同时执行多个任务,而Channel则是多个Goroutine之间进行通信的重要机制。

Goroutine的启动非常简单,只需要在函数前面加上关键字go即可。例如:

`go

func main() {

go foo()

go bar()

}

func foo() {

// 这里是foo的任务逻辑

}

func bar() {

// 这里是bar的任务逻辑

}

在上面的代码中,我们可以看到主函数中启动了两个Goroutine,分别是foo和bar。这样,我们就可以同时执行多个任务了。Channel则是用于实现Goroutine之间通信的重要机制。通常来说,一个Goroutine在执行任务的时候,可能需要取得另一个Goroutine的执行结果。这时候,我们就可以使用Channel来进行通信。`gofunc main() {    c := make(chan int)    go sum(1, 2, c)    result := <-c    fmt.Println(result)}func sum(a int, b int, c chan int) {    sum := a + b    c <- sum}

在上面的代码中,我们定义了一个Channel,然后启动了一个Goroutine来执行sum函数,将执行结果通过Channel发送出去。在主函数中,我们则通过<-c的方式来接受Channel中的值。这样,我们就可以实现Goroutine之间的通信了。

2. Golang的Mutex和WaitGroup

除了Goroutine和Channel之外,Golang并发模型中还有两个非常重要的概念,分别是Mutex和WaitGroup。

Mutex是Golang中的互斥锁,用于在多个Goroutine之间保持排他性。如果多个Goroutine同时对某个共享变量进行读写,会导致数据错乱,使用Mutex可以解决这个问题。

`go

var mutex sync.Mutex

func main() {

go foo()

go bar()

}

func foo() {

mutex.Lock()

// 这里是foo的任务逻辑

mutex.Unlock()

}

func bar() {

mutex.Lock()

// 这里是bar的任务逻辑

mutex.Unlock()

}

在上面的代码中,我们定义了一个全局的互斥锁mutex,然后在foo和bar函数中,对共享变量进行了读写。在对共享变量进行读写的时候,我们使用了mutex.Lock()和mutex.Unlock()来保持排他性。WaitGroup则是Golang中的等待组,用于等待多个Goroutine任务的完成。如果我们希望主程序等待多个Goroutine任务执行完成之后再结束,可以使用WaitGroup来实现。`govar wg sync.WaitGroupfunc main() {    wg.Add(2)    go foo()    go bar()    wg.Wait()    fmt.Println("任务执行完成")}func foo() {    defer wg.Done()    // 这里是foo的任务逻辑}func bar() {    defer wg.Done()    // 这里是bar的任务逻辑}

在上面的代码中,我们定义了一个全局的等待组wg,并且在主函数中调用了wg.Wait()进行等待。在foo和bar函数中,我们则分别调用了wg.Done()来通知等待组任务已经完成。这样,当两个任务执行完成之后,主程序就会退出了。

3. Golang Select和Timeout

Golang中的Select和Timeout也是Golang并发模型中的两个非常重要的概念。Select可以用来在多个Channel中选择执行操作,而Timeout则可以用来设置操作超时时间。

`go

func main() {

c1 := make(chan int)

c2 := make(chan int)

go func() {

time.Sleep(time.Second)

c1 <- 1

}()

go func() {

time.Sleep(time.Second * 2)

c2 <- 2

}()

select {

case r1 := <-c1:

fmt.Println("收到c1结果:", r1)

case r2 := <-c2:

fmt.Println("收到c2结果:", r2)

case <-time.After(time.Second * 3):

fmt.Println("执行超时")

}

}

在上面的代码中,我们定义了两个Channel,然后启动了两个Goroutine分别向两个Channel中发送数据。在主函数中,我们则使用select来选择执行操作,如果在三秒内收到其中一个Channel的结果,则打印出结果,否则打印出执行超时。另外,在使用Channel的时候,我们还可以通过向Channel中添加第二个返回值,来判断是否成功发送或接收数据。`gofunc main() {    c := make(chan int)    go func() {        ret, ok := <-c        fmt.Println(ret, ok)    }()    c <- 1    close(c)}

在上面的代码中,我们启动一个Goroutine来从Channel中接收数据,并打印出其成功接收的结果。在主函数中,我们则向Channel中发送数据,并通过close函数关闭Channel。这样,当Goroutine从Channel中读取到关闭通知的时候,就可以结束执行了。

总结

在本文中,我们为大家讲解了Golang并发模型的相关知识点,包括Goroutine、Channel、Mutex、WaitGroup、Select和Timeout等。这些知识点是Golang并发模型的基础,如果大家能够深入理解并掌握,就可以写出高效、优美并发程序。

以上就是IT培训机构千锋教育提供的相关内容,如果您有web前端培训鸿蒙开发培训python培训linux培训,java培训,UI设计培训等需求,欢迎随时联系千锋教育。

相关文章

您需要知道的10种最常见的网络安全漏洞

您需要知道的10种最常见的网络安全漏洞

2023-12-27
零信任安全模型揭秘:如何保护企业网络?

零信任安全模型揭秘:如何保护企业网络?

2023-12-27
国内外大型公司的网络安全架构分析与比较

国内外大型公司的网络安全架构分析与比较

2023-12-27
神器出击:10个必备的网络安全工具推荐

神器出击:10个必备的网络安全工具推荐

2023-12-27

最新文章

网络安全现在的就业薪资怎么样

网络安全现在的就业薪资怎么样

2023-12-25
学习网络安全编程好就业吗

学习网络安全编程好就业吗

2023-12-25
网络安全编程就业方向如何

网络安全编程就业方向如何

2023-12-25
网络安全培训就业方向有哪些

网络安全培训就业方向有哪些

2023-12-25
在线咨询 免费试学 教程领取