返回顶部
首页 > 资讯 > 后端开发 > GO >使用Go协程和等待组
  • 503
分享到

使用Go协程和等待组

2024-04-04 23:04:40 503人浏览 安东尼
摘要

从现在开始,我们要努力学习啦!今天我给大家带来《使用Go协程和等待组》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到等等知识点,如果在阅读本文过程中有遇到不清楚的地方,欢迎留言呀!我们一

从现在开始,我们要努力学习啦!今天我给大家带来《使用Go协程和等待组》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到等等知识点,如果在阅读本文过程中有遇到不清楚的地方,欢迎留言呀!我们一起讨论,一起学习!

问题内容

我正在尝试在我的 api 中使用 goroutine。我需要检查我使用的方法是否正确或者是否需要改进。

我正在使用 go 创建 rest-api。也使用 sql-boiler。

在我的许多 api 中,我使用了一些其他功能,例如使用 aws 发送通知、使用 aws 发送电子邮件、mailchimp 集成。

一些 api 使用这 3 个功能而不是我们的数据库活动。

所以我发现 api 需要一些时间来显示结果。然后我找到了 goroutine 和 wait-group。

在这里,我不想花时间来完成我的 api。但我想超越代码背后的其他功能。

所以我刚刚检查了一下,我对 goroutine 和 wait-group 感到困惑。 当我在 3 个功能中使用 wait-group 时,我明白..完成所有功能后 api 会给出响应。

但是,当使用 goroutine api 时,很容易给出响应,并且其他功能正在后台执行。

使用 goroutine api 比 waitgroup 花费的时间更少..

这是正确的吗? 我的方法是否正确?或者我的工作流程中缺少什么?

{
if impartwealthids != "" {
        impartwealthids = strings.trim(impartwealthids, ",")
        updateuser := fmt.sprintf(`update user 
        set deleted_at='%s' ,
         email=concat(email, "-", impart_wealth_id),
         screen_name=concat(screen_name, "-", impart_wealth_id),
         deleted_by_admin=true 
         where impart_wealth_id in(%s);
        `, golangdatetime, impartwealthids)

        query = updateuser
    }
    _, err = queries.raw(query).execcontext(ctx, m.db)
    m.logger.info(query)
    if err != nil {
        m.logger.error("query failed", zap.any("query", err))
        return err
    }
    go func() {
        for _, user := range userdetails {
            email := fmt.sprintf("%s-%s", user.impartwealthid, user.email)
            userup := management.user{
                email: &email,
            }
            err = mngmnt.user.update(*&user.authenticationid, &userup)
            if err != nil {
                m.logger.error("auth update failed", zap.any("user.email", user.email), zap.any("query", err))
            }
        }
    }()
    go impart.userdemographicsupdate(ctx, m.db, true, true)
        if user.r.memberHivehives != nil {
            if user.r.memberhivehives[0].notificationtopicarn.string != "" {
                go func() {
                    err := m.notificationservice.unsubscribetopicforalldevice(ctx, user.impartwealthid, user.r.memberhivehives[0].notificationtopicarn.string)
                    if err != nil {
                        m.logger.error("subscribetopic", zap.string("devicetoken", user.r.memberhivehives[0].notificationtopicarn.string),
                            zap.error(err))
                    }
                }()
            }
        }
    go impart.userdemographicsupdate(ctx, m.db, true, true)
    return "success"
}

此处api在数据库操作后返回成功,其他goroutines将在后台运行

我还有一个双人床

如果我使用用户的 for 循环。我需要为每个用户更新一些数据..

for _, user := range userdetails {
// calling auth 0
// calling mailchimp
// calling aws
}

我需要更新每个用户的数据

那么我的问题是哪种是使用 goroutine 的最佳方法?

方法1

for _, user := range userdetails {
        go calling auth 0
        go calling mailchimp
        go calling aws

        }

方法 - 2

for _, user := range userDetails {
        go func(user *dbmodels.User) {
            // calling auth 0
            // calling mailchimp
            // calling aws
        }(user)
            }

哪一种是最好的方法?


正确答案


这两种建议的方法可能不适用于大量数据,这两种方法都会分别创建 3N 和 N 个 goroutine,这足以使大量用户的系统崩溃。 使用工作池将是最好的解决方案,可以使用任何您觉得方便的方法。这样您就可以限制呼叫。 参考:https://gobyexample.com/worker-pools

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《使用Go协程和等待组》文章吧,也可关注编程网公众号了解相关技术文章。

您可能感兴趣的文档:

--结束END--

本文标题: 使用Go协程和等待组

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

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

猜你喜欢
  • 使用Go协程和等待组
    从现在开始,我们要努力学习啦!今天我给大家带来《使用Go协程和等待组》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到等等知识点,如果在阅读本文过程中有遇到不清楚的地方,欢迎留言呀!我们一...
    99+
    2024-04-04
  • go等待一组协程结束的操作方式
    go提供了sync包和channel来解决协程同步和通讯。 方式1: sync.WaitGroup是等待一组协程结束,sync.WaitGroup只有3个方法,Add()添加一...
    99+
    2022-06-07
    GO 协程
  • Python 异步如何使用等待有时间限制协程
    目录正文1. 什么是 Asyncio wait_for()2. 如何使用 Asyncio wait_for()3. 带有超时的 Asyncio wait_for() 示例正文 我们...
    99+
    2023-03-22
    Python 异步时间限制协程 Python 异步协程等待
  • Python异步怎么使用等待有时间限制协程
    本文小编为大家详细介绍“Python异步怎么使用等待有时间限制协程”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python异步怎么使用等待有时间限制协程”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。我们可以使...
    99+
    2023-07-05
  • 同步缓冲通道和等待组
    php小编子墨介绍同步缓冲通道和等待组,这是一种在并发编程中常用的技术。同步缓冲通道允许多个线程之间进行数据传递,通过缓冲区来实现线程之间的同步。而等待组则用于管理一组线程,等待某个特...
    99+
    2024-02-09
  • Golang控制通道实现协程等待详解
    目录前言方法一-睡眠等待方法二-通道什么是通道通道的特性什么是非缓冲通道什么是缓冲通道通道的简单使用非缓冲通道缓冲通道小心死锁使用通道实现协程等待前言 上一次简单了解了协程的工作原理...
    99+
    2022-11-21
    Golang通道实现协程等待 Go实现协程等待
  • Go语言的并发编程和协程使用
    Go语言作为一种强大的编程语言,以其简洁、高效的特性而著称。其中,其强大的并发编程和协程使用是其最大的亮点之一。本文将介绍Go语言中并发编程和协程的原理以及具体使用方法,并提供一些代码...
    99+
    2024-03-02
    go语言 协程 并发
  • 等待映射中的值在 Go 中可用
    问题内容 我有一个程序,基本上有三种情况 - 设置键的值,获取值(如果存在),或者等到给定键的值可用。我最初的想法 - 创建一个带有 map[string]interface{} 的新...
    99+
    2024-02-05
  • 高效并发编程:使用Go WaitGroup和协程池
    在Go语言中,可以使用WaitGroup和协程池来实现高效的并发编程。1. WaitGroup:WaitGroup是一个计数器,用于...
    99+
    2023-10-08
    Golang
  • shellwait等待命令的具体使用
    目录1. 简介2. 语法3. 示例3.1 等待命令3.2 单进程等待3.3 单进程 bash 等待3.4 多个进程等待3.5 多个进程 bash 等待 PID1. 简介 bash w...
    99+
    2023-01-12
    shell wait
  • 死锁 - 所有 goroutine 都处于睡眠状态(即使使用等待组)
    php小编小新在这里为大家介绍一种常见的并发编程问题——死锁。死锁是指所有goroutine都进入了睡眠状态,即使使用了等待组等机制,也无法继续执行下去。这种情况下,所有的gorout...
    99+
    2024-02-09
  • Go语言同步等待组sync.WaitGroup结构体对象方法详解
    目录sync.WaitGroup结构体对象WaitGroup的结构体Add()方法Done()方法Wait()方法Add()、Done()、Wait()三者对比sync.WaitGr...
    99+
    2024-04-02
  • swoole协程和go协程有哪些区别
    这篇文章主要讲解了“swoole协程和go协程有哪些区别”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“swoole协程和go协程有哪些区别”吧!区别:1、go协程是基于多线程的,可以利用多核...
    99+
    2023-06-29
  • 如何使用spin.js生成等待效果
    这篇文章将为大家详细讲解有关如何使用spin.js生成等待效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。效果截图<%@ page langu...
    99+
    2024-04-02
  • shell wait等待命令的具体使用
    目录1. 简介2. 语法3. 示例3.1 等待命令3.2 单进程等待3.3 单进程 bash 等待3.4 多个进程等待3.5 多个进程 bash 等待 PID1. 简介 bash wait 命令是一个 Shell 命令,...
    99+
    2023-01-12
    shellwait
  • Python异步等待任务怎么使用
    今天小编给大家分享一下Python异步等待任务怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。正文我们可以通过 asy...
    99+
    2023-07-05
  • Go语言编程实践:主函数的执行与等待
    【标题】Go语言编程实践:主函数的执行与等待 Go语言作为一种并发编程语言,其主函数的执行与等待是一个非常重要的话题。在Go中,主函数通常是main函数,是程序的入口,负责启动程序并...
    99+
    2024-03-10
    执行 等待 主函数 go语言
  • C#如何使用Task类解决线程的等待问题
    目录使用Task类解决线程的等待问题Task类用法示例小结C#代码执行中等待10秒使用Task类解决线程的等待问题 在任何的编程语言中,面对耗时任务时,我们都会有这样的需求:让任务执...
    99+
    2024-04-02
  • Go中什么是协程,协程和线程的区别和联系
    在Go中,协程(Goroutine)是一种轻量级的线程,由Go运行时环境管理。协程是一种用户态的线程,不需要操作系统的线程支持。在G...
    99+
    2023-09-23
    Go
  • Go使用协程交替打印字符
    需求: 模拟两个协程,分别循环打印字母A和B。 分析: 要实现两个协程之间的交替协作,就必须用到channel通信机制,而channel正好是同步阻塞的。 半开方式 首先我们用...
    99+
    2022-06-07
    GO 协程 字符
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作