返回顶部
首页 > 资讯 > 精选 >如何使用sync.WaitGroup来执行所有的goroutine?
  • 772
分享到

如何使用sync.WaitGroup来执行所有的goroutine?

go语言 2024-02-09 11:02:00 772人浏览 泡泡鱼
摘要

PHP小编苹果为您介绍一种实用的方法来执行所有的Goroutine - sync.WaitGroup。在Go语言中,goroutine是轻量级的线程,可以同时执行多个任务。然而,有时我

PHP小编苹果为您介绍一种实用的方法来执行所有的Goroutine - sync.WaitGroup。在Go语言中,goroutine是轻量级的线程,可以同时执行多个任务。然而,有时我们需要等待所有的goroutine执行完毕后再继续下一步操作。这时,sync.WaitGroup就派上用场了。它提供了一种简单而有效的方式来等待所有的goroutine完成,确保程序的正确执行顺序。接下来,我们将详细介绍如何使用sync.WaitGroup来实现这个功能。

问题内容

目前我正在将所有值推送到通道并从中读取并计算其平方。 我想避免使用 time.sleep(2000 * time.millisecond) 因为它会阻止执行 2 秒,而是我希望每个 goroutine 都处理并等待其执行,然后退出程序。我刚刚脱离了 golang,所以现在问这个基本问题:(。有人能帮我解决这个问题吗?

package main

import (
    "fmt"
    "sync"
    "time"
)

func doSquare(num int) int {
    return num * num
}

var wg sync.WaitGroup

func main() {

    wg.Add(1)
    st := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    quit := make(chan bool)
    ch := make(chan int)
    go func() {
        for i := range st {
            ch <- i
        }
    }()

    go func() {
        for {
            select {
            case x := <-ch:
                fmt.Println(doSquare(x))
                // return

            case <-quit:
                wg.Done()
            default:
                // fmt.Println("---")
                // do something
            }
        }
    }()

    quit <- true

    wg.Wait()
    time.Sleep(2000 * time.Millisecond)
}

解决方法

只需将 qui​​t <- true 移至第一个 goroutine 的末尾即可

func main() {
    wg.add(1)
    st := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    quit := make(chan bool)
    ch := make(chan int)
    go func() {
        for i := range st {
            ch <- i
        }
        quit <- true
    }()

    go func() {
        for {
            select {
            case x := <-ch:
                fmt.println(dosquare(x))
                // return

            case <-quit:
                wg.done()
                return
            default:
                // fmt.println("---")
                // do something
            }
        }
    }()

    wg.wait()
}

这是 close(ch) 表示没有更多数据的另一种方式

func main() {
    st := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
    quit := make(chan bool)
    ch := make(chan int) // improve concurrency by `ch := make(chan int, 100)`
    go func() {
        for i := range st {
            ch <- i
        }
        close(ch)
    }()

    go func() {
        for x := range ch {
            fmt.Println(doSquare(x))
        }
        quit <- true
    }()

    <-quit
}

以上就是如何使用sync.WaitGroup来执行所有的goroutine?的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: 如何使用sync.WaitGroup来执行所有的goroutine?

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

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

猜你喜欢
  • 如何使用sync.WaitGroup来执行所有的goroutine?
    php小编苹果为您介绍一种实用的方法来执行所有的goroutine - sync.WaitGroup。在Go语言中,goroutine是轻量级的线程,可以同时执行多个任务。然而,有时我...
    99+
    2024-02-09
    go语言
  • 使用带有sync.WaitGroup的goroutine结果不一致
    在Go语言中,使用goroutine可以实现并发执行任务,而sync.WaitGroup则是一种同步机制,用于等待一组goroutine的完成。然而,php小编香蕉发现,在某些情况下,...
    99+
    2024-02-09
    go语言 同步机制
  • golang函数如何控制goroutine的执行?
    go 函数控制 goroutine 执行有以下方式:runtime.goexit():强制终止当前 goroutine。sync.waitgroup: 等待一组 goroutines 完...
    99+
    2024-05-04
    golang
  • JavaScript如何使用注释来阻止执行
    本篇内容主要讲解“JavaScript如何使用注释来阻止执行”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript如何使用注释来阻止执行”吧! J...
    99+
    2024-04-02
  • js如何使用注释来阻止执行
    这篇文章主要介绍了js如何使用注释来阻止执行,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。使用注释来阻止执行使用注释来防止代码执行很适合代码...
    99+
    2024-04-02
  • 使用通道时,goroutine 的执行顺序是什么?
    php小编百草在这里给大家解答一个常见的问题:“使用通道时,goroutine 的执行顺序是什么?”在Go语言中,goroutine是轻量级的线程,可以并发执行。当使用通道来进行协程间...
    99+
    2024-02-09
    go语言
  • 【MySQL】如何查询MySQL执行过的所有SQL语句
    文章目录 1 MySQL 的通常查询日志实验2 参考资料 1 MySQL 的通常查询日志实验 通过 MySQL 的通用查询日志可以找到你指定的每一条 sql 语句。很明显会有严重的性能损耗...
    99+
    2023-09-22
    mysql 数据库
  • PHP中如何使用数组来执行Shell命令?
    在PHP中,我们可以使用系统函数来执行Shell命令。使用Shell命令可以让我们在PHP中执行一些系统级别的操作,例如创建文件、运行脚本等等。在本文中,我们将介绍如何使用数组来执行Shell命令,以及其优点和注意事项。 首先,我们需要了...
    99+
    2023-08-25
    数组 shell laravel
  • 如何使用同步原语来防止 Goroutine 并发?
    防止并发问题可以使用同步原语,包括:mutex:允许一次只有一个 goroutine 访问共享数据。semaphore:限制可同时访问共享数据的 goroutine 数量。waitgro...
    99+
    2024-05-15
    同步原语
  • ​laravel如何用命令来执行脚本
    这篇文章主要介绍“laravel如何用命令来执行脚本”,在日常操作中,相信很多人在laravel如何用命令来执行脚本问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”laravel如何用命令来执行脚本”的疑惑有所...
    99+
    2023-06-21
  • 如何使gridview的所有行都可编辑
    要使GridView的所有行都可编辑,可以按照以下步骤操作:1. 设置GridView的属性`AutoGenerateEditBut...
    99+
    2023-09-26
    gridview
  • 使用 CompletableFuture 实现所有任务都执行完之后在执行下一步操作
    在 CompletableFuture 中实现所有任务都执行完之后再执行下一步操作,我们可以使用 CompletableFuture.allOf 方法。allOf 方法接收一个 CompletableFuture 数组,当所有 Comple...
    99+
    2023-09-04
    jvm java
  • PostgreSQL执行聚合函数所使用的数据结构有哪些
    这篇文章主要讲解了“PostgreSQL执行聚合函数所使用的数据结构有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PostgreSQL执行聚合函数所使...
    99+
    2024-04-02
  • 如何使用计时器 Goroutine 进行延时操作?
    计时器 goroutine 可用于在 go 中进行延时操作。通过 time.newtimer() 创建计时器,其 c 通道接收信号以指示延迟结束。计时器可以用 timer.stop() ...
    99+
    2024-05-16
    关键字:定时器
  • Oracle ASM如何使用asmcmd中的cp命令来执行远程复制
    小编给大家分享一下Oracle ASM如何使用asmcmd中的cp命令来执行远程复制,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Oracle ASM使用asmcmd中的cp命令来执行远程...
    99+
    2024-04-02
  • 如何使用php内置函数来增加程序的执行速度?
    随着网络应用程序的复杂性增加,程序的执行速度成为了一个非常重要的考量指标。而PHP作为一种广泛应用的服务器端脚本语言,对于提升程序的执行速度尤为关键。本文将介绍一些使用PHP内置函数来增加程序执行速度的技巧,并提供具体的代码示例。使用字符串...
    99+
    2023-10-21
    缓存 (Cache) 优化 (Optimize) 并行 (Parallel)
  • 如何使用ajax的post同步执行
    小编给大家分享一下如何使用ajax的post同步执行,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一般我们使用的ajax请求时,...
    99+
    2024-04-02
  • 如何在 ASP 中使用关键字 shell 来执行系统命令?
    在 ASP 中,可以使用关键字 shell 来执行系统命令。shell 函数在 Windows 操作系统中非常常见,它允许您在 ASP 中执行诸如复制文件、创建目录、启动应用程序等命令。在本文中,我们将为您介绍如何在 ASP 中使用关键字...
    99+
    2023-11-05
    关键字 shell leetcode
  • 服务器中如何使用特定的执行程序来阻止操作
    这篇文章将为大家详细讲解有关服务器中如何使用特定的执行程序来阻止操作,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。使用特定的执行程序来阻止操作因为一个缓慢的操作而使整个服...
    99+
    2024-04-02
  • 如何使用 PHP 执行 MySQL 事务?
    在 php 中执行 mysql 事务可以确保数据的一致性和完整性。步骤包括:建立数据库连接开启事务执行查询提交事务(所有查询成功)回滚事务(任何查询失败)实战案例:购物车应用程序中,如果...
    99+
    2024-05-12
    php mysql事务 mysql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作