返回顶部
首页 > 资讯 > 前端开发 > html >Go语言中怎么对Concurrency进行管理
  • 820
分享到

Go语言中怎么对Concurrency进行管理

2024-04-02 19:04:59 820人浏览 八月长安
摘要

这篇文章给大家介绍 Go语言中怎么对Concurrency进行管理 ,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。WaitGroup先来了解有什么情境需要使用到  WaitG

这篇文章给大家介绍 Go语言中怎么对Concurrency进行管理 ,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

WaitGroup

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

package main  import (     "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 main  import (     "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) }

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

Context

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

package main  import (     "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 main  import (     "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。

总结

根据不同的情境跟状况来选择不同的方式,做一个总结

  • WaitGroup:需要将单一个工作分解成多个子任务,等到全部完成后,才能进行下一步,这时候用 WaitGroup 最适合了

  • Channel + Select:Channel 只能用在比较单纯的 Goroutine 情况下,如果要管理多个 Goroutine,建议还是 走  context 会比较适合

  • Context:如果您想一次控制全部的 Goroutine,相信用 context 会是最适合不过的。

关于 Go语言中怎么对Concurrency进行管理 就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: Go语言中怎么对Concurrency进行管理

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

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

猜你喜欢
  • Go语言中怎么对Concurrency进行管理
    这篇文章给大家介绍 Go语言中怎么对Concurrency进行管理 ,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。WaitGroup先来了解有什么情境需要使用到  WaitG...
    99+
    2024-04-02
  • Go语言中怎么对栈进行处理
    本篇文章为大家展示了Go语言中怎么对栈进行处理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、线程栈(thread stacks)介绍在我们研究Go的栈处理方式之...
    99+
    2024-04-02
  • Go语言中管理Concurrency的方式有哪些
    这篇文章主要讲解了“Go语言中管理Concurrency的方式有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言中管理Concurrency的方式有哪些”吧!WaitGroup先来...
    99+
    2023-06-27
  • Go语言中怎么对栈中函数进行内联
    这篇文章主要介绍“Go语言中怎么对栈中函数进行内联”,在日常操作中,相信很多人在Go语言中怎么对栈中函数进行内联问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go语言中怎么对栈中函数进行内联”的疑惑有所帮助!...
    99+
    2023-06-16
  • 如何在 GO 中使用对象进行自然语言处理?
    自然语言处理(NLP)在计算机科学领域中是一个重要的子领域,它涉及到计算机如何理解和处理人类语言。GO是一种强大的编程语言,因此它可以用于开发自然语言处理应用程序。在本文中,我们将介绍如何使用GO中的对象进行自然语言处理。 首先,让我们了解...
    99+
    2023-09-05
    自然语言处理 shell 对象
  • go语言怎么进行web开发
    Go语言的Web开发流程为:1、选择Web框架;2、设计路由,指定URL如何映射到处理程序;3、处理请求和响应,包括解析请求参数、处理表单数据、设置Cookie等;4、数据库操作,将数据存储在数据库中;5、模板渲染,将数据呈现给用户使用模板...
    99+
    2023-12-13
    go语言web开发 go语言 Golang
  • flask中怎么对数据库进行管理
    小编给大家分享一下flask中怎么对数据库进行管理,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在flask框架里,有许多数据库需要我们频繁的处理,这样会造成很大...
    99+
    2023-06-14
  • 如何在 SHELL 中使用 GO 对象进行自然语言处理?
    自然语言处理是人工智能领域中的一个重要分支,它涵盖了文本分析、文本挖掘、机器翻译等多个方面。在 SHELL 中使用 GO 对象进行自然语言处理可以提高代码的可读性和可维护性,同时也可以更加方便地利用 GO 语言的强大特性进行自然语言处理。...
    99+
    2023-09-05
    自然语言处理 shell 对象
  • go语言怎么进行网络编程
    go语言进行网络编程的步骤如下:1、导入net包和其他需要的包;2、创建服务器或客户端连接;3、处理连接,为每个连接创建一个新的“goroutine”来处理;4、处理数据,使用“conn.Read()”读取数据,使用“conn.Write(...
    99+
    2023-12-13
    Go语言网络编程 go语言 Golang
  • go语言怎么进行爬虫开发
    go语言进行爬虫开发步骤如下:1、选择合适的库,如GoQuery、Colly、PuerkitoBio和Gocolly等;2、选择合适的库,并获取到返回的响应数据;3、解析HTML,从网页中提取所需的信息;4、并发处理,极大地提高爬取效率;5...
    99+
    2023-12-13
    golang爬虫 go语言 Golang
  • 怎么在Go语言中使用JSON进行请求
    这篇文章主要介绍“怎么在Go语言中使用JSON进行请求”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么在Go语言中使用JSON进行请求”文章能帮助大家解决问题。Go语言提供了许多方式发送HTTP请...
    99+
    2023-07-06
  • Go语言内存管理的进阶技巧
    Go语言作为一种高效、现代化的编程语言,其内置的垃圾回收器帮助开发人员简化了内存管理的工作。然而,对于某些特定场景下的内存管理需求,开发者可能需要一些进阶技巧来优化程序性能。本文将探讨...
    99+
    2024-04-02
  • r语言中怎么进行数据处理
    在R语言中进行数据处理时,常见的操作包括数据清洗、数据转换、数据筛选、数据聚合、数据可视化等。以下是一些常用的数据处理操作: 数据...
    99+
    2024-03-02
    r语言
  • 如何使用Go语言对重定向问题进行处理?
    在网络通信中,重定向是常见的一种情况。当你访问某个网站时,可能会被重定向到另一个网站或页面。在这种情况下,你需要在代码中处理重定向问题,以确保你的程序可以正确地访问目标网站或页面。本文将介绍如何使用Go语言处理重定向问题,并提供演示代码。...
    99+
    2023-09-23
    重定向 leetcode 索引
  • 使用Go语言的切片对数据进行高效处理
    Golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《使用Go语言的切片对数据进行高效处理》带大家来了解一下##content_title#...
    99+
    2024-04-04
  • 怎么在R语言中使用dplyr包对数据进行处理
    这期内容当中小编将会给大家带来有关怎么在R语言中使用dplyr包对数据进行处理,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。数据筛选函数:#可使用filter()函数筛选/查找特定条件的行或者样本#fil...
    99+
    2023-06-08
  • 怎么在go语言中将map与string进行转换
    本篇文章给大家分享的是有关怎么在go语言中将map与string进行转换,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一.map转stringimport (&nbs...
    99+
    2023-06-14
  • Go语言中怎么使用HTTPS协议进行请求
    这篇文章主要介绍“Go语言中怎么使用HTTPS协议进行请求”,在日常操作中,相信很多人在Go语言中怎么使用HTTPS协议进行请求问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go语言中怎么使用HTTPS协议进...
    99+
    2023-07-06
  • 如何在Go语言中使用容器进行自然语言处理?
    自然语言处理是人工智能领域中最重要的应用之一。在Go语言中,使用容器进行自然语言处理是一种非常高效的方式。本文将介绍如何在Go语言中使用容器进行自然语言处理。 一、什么是容器? 容器是一种轻量级的虚拟化技术,可以在单个操作系统上运行多个独立...
    99+
    2023-10-06
    自然语言处理 容器 实时
  • c语言怎么对文件进行读写
    C语言提供了一组文件操作函数,用于打开、读、写和关闭文件。下面是一个简单的示例,演示了如何对文件进行读写。1. 打开文件:```c#...
    99+
    2023-09-27
    c语言
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作