我的编程空间,编程开发者的网络收藏夹
学习永远不晚

使用Go协程和等待组

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

使用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协程和等待组》文章吧,也可关注编程网公众号了解相关技术文章。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

使用Go协程和等待组

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

使用Go协程和等待组

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

go等待一组协程结束的操作方式

go提供了sync包和channel来解决协程同步和通讯。 方式1: sync.WaitGroup是等待一组协程结束,sync.WaitGroup只有3个方法,Add()添加一个计数,Done()减去一个计数,Wait()阻塞直到所有任务完
2022-06-07

Python 异步如何使用等待有时间限制协程

这篇文章主要为大家介绍了Python 异步如何使用等待有时间限制协程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-22

Python异步怎么使用等待有时间限制协程

本文小编为大家详细介绍“Python异步怎么使用等待有时间限制协程”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python异步怎么使用等待有时间限制协程”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。我们可以使
2023-07-05

Go语言的并发编程和协程使用

Go语言作为一种强大的编程语言,以其简洁、高效的特性而著称。其中,其强大的并发编程和协程使用是其最大的亮点之一。本文将介绍Go语言中并发编程和协程的原理以及具体使用方法,并提供一些代码示例来帮助读者更好地理解。一、并发编程在Go语言中,
Go语言的并发编程和协程使用
2024-03-02

高效并发编程:使用Go WaitGroup和协程池

在Go语言中,可以使用WaitGroup和协程池来实现高效的并发编程。1. WaitGroup:WaitGroup是一个计数器,用于等待一组协程的完成。在主协程中添加计数器的数量,然后在每个协程中完成任务后减少计数器的数量。主协程可以使用W
2023-10-08

死锁 - 所有 goroutine 都处于睡眠状态(即使使用等待组)

php小编小新在这里为大家介绍一种常见的并发编程问题——死锁。死锁是指所有goroutine都进入了睡眠状态,即使使用了等待组等机制,也无法继续执行下去。这种情况下,所有的goroutine都无法向前推进,导致程序陷入无限等待的状态。在并发
死锁 - 所有 goroutine 都处于睡眠状态(即使使用等待组)
2024-02-09

Go使用协程交替打印字符

需求: 模拟两个协程,分别循环打印字母A和B。 分析: 要实现两个协程之间的交替协作,就必须用到channel通信机制,而channel正好是同步阻塞的。 半开方式 首先我们用一个channel变量来控制两个goroutine的交替打印:f
2022-06-07

python 多进程和协程配合使用

有一批key已经写入到3个txt文件中,每一个txt文件有30万行记录。现在需要读取这些txt文件,判断key是否在数据仓库中。(redis或者mysql)为空的记录,需要写入到日志文件中!任务分工1. 使用多进程技术,每一个进程读取一个t
2023-01-31

如何使用 Go 协程实现并行处理?

如何使用 go 协程实现并行处理?创建协程并行计算斐波那契数列。协程通过 channel 传递数据,实现并行计算。主协程接收并处理并行计算的结果。如何使用 Go 协程实现并行处理协程简介协程是 Go 中一种轻量级并发原语,它允许在一个
如何使用 Go 协程实现并行处理?
2024-05-21

Go并发:使用sync.WaitGroup实现协程同步方式

经常看到有人会问如何等待主协程中创建的协程执行完毕之后再结束主协程,例如如下代码:package main import ("fmt" ) func main() {go func() {fmt.Println("Goroutine 1")
2022-06-07

C#如何使用SplashScreenManager控件实现启动闪屏和等待信息窗口

这篇文章主要介绍了C#如何使用SplashScreenManager控件实现启动闪屏和等待信息窗口的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#如何使用SplashScreenManager控件实现启动闪屏
2023-06-30

go同步协程的必备工具WaitGroup怎么使用

本篇内容主要讲解“go同步协程的必备工具WaitGroup怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“go同步协程的必备工具WaitGroup怎么使用”吧!1. 简介本文将介绍 Go
2023-07-05

如何使用Go语言和Redis开发团队协作工具

如何使用Go语言和Redis开发团队协作工具引言:在团队协作中,高效的工具可以帮助团队成员更好地协同工作。本文将介绍如何使用Go语言和Redis开发一个简单的团队协作工具,并提供具体的代码示例。Go语言简介Go语言是一种开源的静态类型编程语
如何使用Go语言和Redis开发团队协作工具
2023-10-28

Golang中协程和线程的异同及使用场景

Golang中协程和线程的区别与应用场景在Golang中,协程(goroutine)和线程(thread)是两种并发编程的方式。它们在原理和应用场景上有着明显的差异。本文将分别介绍协程和线程,并通过具体的代码示例说明它们的区别和应用场景。
Golang中协程和线程的异同及使用场景
2024-01-24

GO语言协程互斥锁Mutex和读写锁RWMutex怎么用

本文小编为大家详细介绍“GO语言协程互斥锁Mutex和读写锁RWMutex怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“GO语言协程互斥锁Mutex和读写锁RWMutex怎么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一
2023-06-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录