返回顶部
首页 > 资讯 > 精选 >Go语言中管理Concurrency的方式有哪些
  • 588
分享到

Go语言中管理Concurrency的方式有哪些

2023-06-27 11:06:29 588人浏览 独家记忆
摘要

这篇文章主要讲解了“Go语言中管理Concurrency的方式有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言中管理Concurrency的方式有哪些”吧!WaitGroup先来

这篇文章主要讲解了“Go语言中管理Concurrency的方式有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言中管理Concurrency的方式有哪些”吧!

WaitGroup

先来了解有什么情境需要使用到 WaitGroup,假设您有两台机器需要同时上传最新的代码,两台机器分别上传完成后,才能执行最后的重启步骤。就像是把一个工作同时拆成好几份同时一起做,可以减少时间,但是最后需要等到全部做完,才能执行下一步,这时候就需要用到 WaitGroup 才能做到。

package mainimport (    "fmt"    "sync")func main() {    var wg sync.WaitGroup    i := 0    wg.Add(3) //task count wait to do    go func() {        defer wg.Done() // finish task1        fmt.Println("goroutine 1 done")        i++    }()    go func() {        defer wg.Done() // finish task2        fmt.Println("goroutine 2 done")        i++    }()    go func() {        defer wg.Done() // finish task3        fmt.Println("goroutine 3 done")        i++    }()    wg.Wait() // wait for tasks to be done    fmt.Println("all goroutine done")    fmt.Println(i)}

Channel

另外一种实际的案例就是,我们需要主动通知一个 Goroutine 进行停止的动作。换句话说,当 App 启动时,会在后台跑一些监控程序,而当整个 App 需要停止前,需要发个 Notification 给后台的监控程序,将其先停止,这时候就需要用到 Channel 来通知。看下下面这个例子:

package mainimport (    "fmt"    "time")func main() {    exit := make(chan bool)    go func() {        for {            select {            case <-exit:                fmt.Println("Exit")                return            case <-time.After(2 * time.Second):                fmt.Println("Monitoring")            }        }    }()    time.Sleep(5 * time.Second)    fmt.Println("Notify Exit")    exit <- true //keep main goroutine alive    time.Sleep(5 * time.Second)}

上面的例子可以发现,用了一个 GogourtineChannel 来控制。可以想像当后台有无数个 Goroutine 的时候,我们就需要用多个 Channel 才能进行控制,也许 Goroutine 内又会产生 Goroutine开发者这时候就会发现已经无法单纯使用 Channel 来控制多个 Goroutine 了。这时候解决方式会是传递 Context

Context

大家可以想像,今天有一个后台任务 A,A 任务又产生了 B 任务,B 任务又产生了 C 任务,也就是可以按照此模式一直产生下去,假设中途我们需要停止 A 任务,而 A 又必须告诉 B 及 C 要一起停止,这时候通过 context 方式是最快的了。

package mainimport (    "context"    "fmt"    "time")func foo(ctx context.Context, name string) {    go bar(ctx, name) // A calls B    for {        select {        case <-ctx.Done():            fmt.Println(name, "A Exit")            return        case <-time.After(1 * time.Second):            fmt.Println(name, "A do something")        }    }}func bar(ctx context.Context, name string) {    for {        select {        case <-ctx.Done():            fmt.Println(name, "B Exit")            return        case <-time.After(2 * time.Second):            fmt.Println(name, "B do something")        }    }}func main() {    ctx, cancel := context.WithCancel(context.Background())    go foo(ctx, "FooBar")    fmt.Println("client release connection, need to notify A, B exit")    time.Sleep(5 * time.Second)    cancel() //mock client exit, and pass the signal, ctx.Done() gets the signal  time.Sleep(3 * time.Second)    time.Sleep(3 * time.Second)}
package mainimport (    "context"    "fmt"    "time")func foo(ctx context.Context, name string) {    go bar(ctx, name) // A calls B    for {        select {        case <-ctx.Done():            fmt.Println(name, "A Exit")            return        case <-time.After(1 * time.Second):            fmt.Println(name, "A do something")        }    }}func bar(ctx context.Context, name string) {    for {        select {        case <-ctx.Done():            fmt.Println(name, "B Exit")            return        case <-time.After(2 * time.Second):            fmt.Println(name, "B do something")        }    }}func main() {    ctx, cancel := context.WithCancel(context.Background())    go foo(ctx, "FooBar")    fmt.Println("client release connection, need to notify A, B exit")    time.Sleep(5 * time.Second)    cancel() //mock client exit, and pass the signal, ctx.Done() gets the signal  time.Sleep(3 * time.Second)    time.Sleep(3 * time.Second)}

大家可以把 context 想成是一个 controller,可以随时控制不确定个数的 Goroutine,由上往下,只要宣告context.WithCancel后,再任意时间点都可以通过cancel()来停止整个后台服务。实际案例会用在当 App 需要重新启动时,要先通知全部 goroutine 停止,正常停止后,才会重新启动 App。

感谢各位的阅读,以上就是“Go语言中管理Concurrency的方式有哪些”的内容了,经过本文的学习后,相信大家对Go语言中管理Concurrency的方式有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: Go语言中管理Concurrency的方式有哪些

本文链接: https://lsjlt.com/news/309895.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Go语言中管理Concurrency的方式有哪些
    这篇文章主要讲解了“Go语言中管理Concurrency的方式有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言中管理Concurrency的方式有哪些”吧!WaitGroup先来...
    99+
    2023-06-27
  • Go语言中怎么对Concurrency进行管理
    这篇文章给大家介绍 Go语言中怎么对Concurrency进行管理 ,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。WaitGroup先来了解有什么情境需要使用到  WaitG...
    99+
    2024-04-02
  • go语言内存管理的方法有哪些
    Go语言内存管理的方法有以下几种:1. 垃圾回收(Garbage Collection):Go语言使用自动垃圾回收机制来管理内存。垃...
    99+
    2023-09-27
    go语言
  • go语言中字符串的拼接方式有哪些
    本篇内容主要讲解“go语言中字符串的拼接方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“go语言中字符串的拼接方式有哪些”吧!+拼接方式这种方式是我在写golang经常用的方式,go语言...
    99+
    2023-06-22
  • Go语言读取文件的方式有哪些
    这篇文章主要介绍了Go语言读取文件的方式有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go语言读取文件的方式有哪些文章都会有所收获,下面我们一起来看看吧。整个文件读取我们可以很容易地一次性读取整个文件并将...
    99+
    2023-07-06
  • go语言中的缓存容器和并发处理方式有哪些?
    Go语言是一门高效、并发的编程语言,它提供了许多方便的工具和库,用于实现并发编程和缓存容器。在本文中,我们将了解Go语言中的缓存容器和并发处理方式,并提供一些演示代码来帮助你更好地理解这些概念。 一、缓存容器 缓存容器是一种存储数据的容器,...
    99+
    2023-11-07
    缓存 并发 容器
  • Go语言中的接口函数打包方式有哪些?
    Go语言作为一种现代化的编程语言,被广泛应用于各种领域。其中,接口函数是一种非常重要的特性,它可以让开发者更加灵活地使用和扩展代码。本文将介绍Go语言中的接口函数打包方式,帮助读者更好地理解和应用这一特性。 一、什么是接口函数 在Go语言中...
    99+
    2023-09-20
    打包 接口 函数
  • Go语言分布式函数的部署与管理有哪些挑战?
    随着云计算技术的普及,越来越多的应用程序开始采用分布式架构来支持高并发访问。而在分布式架构中,函数式编程是一种很受欢迎的方式。函数式编程可以让程序员更加专注于业务逻辑,而不必过多考虑底层的技术实现。而Go语言作为一种快速、安全、高效的编程...
    99+
    2023-09-12
    分布式 unix 函数
  • go语言中的输出方法有哪些
    这篇文章主要介绍了go语言中的输出方法有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇go语言中的输出方法有哪些文章都会有所收获,下面我们一起来看看吧。输出方法:1、Print()函数,可输出到控制台(不接...
    99+
    2023-07-04
  • Go语言的错误处理方法有哪些
    这篇文章主要介绍了Go语言的错误处理方法有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go语言的错误处理方法有哪些文章都会有所收获,下面我们一起来看看吧。与其他语言的快速比较在 Go 中,所有的错误都是值...
    99+
    2023-06-17
  • go语言错误处理的方法有哪些
    Go语言中的错误处理方法有以下几种:1. 返回错误值:函数可以返回一个额外的错误值,通常是一个error类型的值,用于表示函数执行过...
    99+
    2023-08-15
    go语言
  • Go语言的数据库连接方式有哪些?
    Go语言作为一种强大的编程语言,拥有丰富的数据库连接方式,方便开发人员在应用程序中进行数据库操作。在Go语言中,常见的数据库连接方式主要包括使用原生数据库驱动以及使用ORM框架。下面将...
    99+
    2024-04-02
  • go的语言有哪些
    go的语言有基本类型、数组、切片、字典、结构体、接口、函数、通道和接收器。1、基本类型,包括布尔型、整数型、无符号整数型和浮点型等;2、数组,具有固定长度且类型一致的数据结构;3、切片,基于数组实现的,可以从已有的数组或切片中创建;4、字典...
    99+
    2023-07-31
  • Go语言分布式函数的实现方式有哪些?
    随着互联网技术的快速发展,分布式技术越来越成为互联网应用的重要组成部分。Go语言作为一门高效的编程语言,其在分布式领域也有着广泛的应用。那么,Go语言分布式函数的实现方式有哪些呢? RPC RPC(Remote Procedure C...
    99+
    2023-09-12
    分布式 unix 函数
  • 基于NPM的GO语言依赖管理工具有哪些?
    随着Go语言的流行,越来越多的人开始使用它来开发应用程序。但是,与其他语言一样,Go语言也需要管理依赖项。为了解决这个问题,人们开始使用NPM来管理Go语言的依赖项。本文将介绍基于NPM的Go语言依赖管理工具。 dep dep是一个Go...
    99+
    2023-06-21
    响应 容器 npm
  • Go语言二维数组的传参方式有哪些
    小编给大家分享一下Go语言二维数组的传参方式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!go适合做什么go是golang的简称,而golang可以做服务器...
    99+
    2023-06-14
  • Go语言中net包RPC远程调用方式有哪些
    这篇文章主要介绍Go语言中net包RPC远程调用方式有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、服务端在代码中,启动了三个服务package mainimport ("log...
    99+
    2023-06-25
  • go语言中的框架有哪些
    go语言中的框架有哪些?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。操作环境:windows10系统、GO 1.11.2、thinkpad t480电脑。Go 是一个快速增...
    99+
    2023-06-14
  • go语言中好的ide有哪些
    这篇“go语言中好的ide有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“go语言中好的ide有哪些”文章吧。用于go语...
    99+
    2023-07-04
  • Go语言实现的语言有哪些
    这篇文章主要讲解了“Go语言实现的语言有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言实现的语言有哪些”吧!01 Go+这是国内七牛老大许式伟主导的,对 Go 语言的扩展,专为数...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作