0

0

Golang 中 Goroutines 和 Channels 的执行顺序控制方法

WBOY

WBOY

发布时间:2023-08-09 09:06:24

|

1673人浏览过

|

来源于php中文网

原创

golang 中 goroutines 和 channels 的执行顺序控制方法

Golang 中 Goroutines 和 Channels 的执行顺序控制方法

在 Golang 编程中,Goroutine 和 Channel 是两个非常重要的概念。Goroutine 是一种轻量级的线程,可以在程序的执行过程中同时运行多个函数。而 Channel 则是用于 Goroutine 之间进行通信的机制。

在某些情况下,我们需要控制 Goroutine 和 Channel 的执行顺序,确保程序按照我们预期的方式运行。本文将介绍一些常见的方法,来实现 Goroutine 和 Channel 的顺序控制。

方法一:使用 WaitGroup

WaitGroup 是一个计数器,用于等待一组 Goroutine 的结束。它的工作原理是每启动一个 Goroutine,就将计数器加一;每个 Goroutine 执行完毕之后,将计数器减一。当计数器归零时,主线程会继续执行。

立即学习go语言免费学习笔记(深入)”;

下面是一个使用 WaitGroup 进行顺序控制的示例代码:

package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup

    wg.Add(2)

    go func() {
        defer wg.Done()
        fmt.Println("Goroutine 1")
    }()

    go func() {
        defer wg.Done()
        fmt.Println("Goroutine 2")
    }()

    wg.Wait()

    fmt.Println("Main Goroutine")
}

在这个例子中,我们创建了两个 Goroutine,每个 Goroutine 打印一条消息。在每个 Goroutine 中,我们通过 defer wg.Done() 语句将计数器减一。最后,wg.Wait() 会阻塞主线程,直到所有 Goroutine 执行完毕。

运行以上代码,输出结果为:

Goroutine 1
Goroutine 2
Main Goroutine

可以看到,Goroutine 1 和 Goroutine 2 的执行顺序是不确定的,但是它们一定在主线程打印 "Main Goroutine" 之前完成。

方法二:使用无缓冲的 Channel

无缓冲的 Channel 可以用来阻塞 Goroutine 的执行,直到另一个 Goroutine 从 Channel 中接收到数据。通过构建一个 Goroutine 的依赖关系链,我们可以实现顺序执行多个 Goroutine。

下面是一个使用无缓冲 Channel 进行顺序控制的示例代码:

package main

import (
    "fmt"
)

func main() {
    ch1 := make(chan struct{})
    ch2 := make(chan struct{})

    go func() {
        fmt.Println("Goroutine 1")
        ch1 <- struct{}{}
    }()

    go func() {
        <-ch1
        fmt.Println("Goroutine 2")
        ch2 <- struct{}{}
    }()

    <-ch2

    fmt.Println("Main Goroutine")
}

在这个例子中,Goroutine 1 打印一条消息后,向 ch1 Channel 中发送一个空结构体。接着,Goroutine 2 从 ch1 Channel 中接收到数据后打印另一条消息,并向 ch2 Channel 中发送一个空结构体。最后,主线程从 ch2 Channel 中接收到数据后打印 "Main Goroutine"。

Shell脚本编写基础 中文WORD版
Shell脚本编写基础 中文WORD版

Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。它虽然不是Linux系统核心的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此,对于用户来说,shell是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Linux系统

下载

运行以上代码,输出结果为:

Goroutine 1
Goroutine 2
Main Goroutine

可以看到,Goroutine 1 和 Goroutine 2 的执行顺序是确定的,它们一定在主线程打印 "Main Goroutine" 之前完成。

方法三:使用有缓冲的 Channel

有缓冲的 Channel 允许我们在创建时指定一个容量,可以存储一定数量的数据。通过合理设置缓冲区大小,我们可以控制 Goroutine 的并发执行数量,实现顺序控制。

下面是一个使用有缓冲的 Channel 进行顺序控制的示例代码:

package main

import (
    "fmt"
)

func main() {
    ch := make(chan struct{}, 2)

    go func() {
        fmt.Println("Goroutine 1")
        ch <- struct{}{}
    }()

    go func() {
        fmt.Println("Goroutine 2")
        ch <- struct{}{}
    }()

    <-ch
    <-ch

    fmt.Println("Main Goroutine")
}

在这个例子中,我们创建了一个有容量为2的缓冲区的 ch Channel。在每个 Goroutine 中,我们发送了一个空结构体到 ch Channel 中。最后,主线程从 ch Channel 中接收两次数据后打印 "Main Goroutine"。

运行以上代码,输出结果为:

Goroutine 1
Goroutine 2
Main Goroutine

可以看到,Goroutine 1 和 Goroutine 2 的执行顺序是确定的,它们一定在主线程打印 "Main Goroutine" 之前完成。

通过上述方法,我们可以灵活地控制 Goroutine 和 Channel 的执行顺序。根据实际需求,选择合适的方法,可以提高程序的并发性和效率。

总结:

本文介绍了在 Golang 中控制 Goroutine 和 Channel 的执行顺序的三种常见方法:使用 WaitGroup、使用无缓冲的 Channel 和使用有缓冲的 Channel。通过合理使用这些方法,可以实现灵活的并发控制,提高程序的性能和效率。

相关专题

更多
java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.21

windows激活码分享 windows一键激活教程指南
windows激活码分享 windows一键激活教程指南

Windows 10/11一键激活可以通过PowerShell脚本或KMS工具实现永久或长期激活。最推荐的简便方法是打开PowerShell(管理员),运行 irm https://get.activated.win | iex 脚本,按提示选择数字激活(选项1)。其他方法包括使用HEU KMS Activator工具进行智能激活。

0

2026.01.21

excel表格操作技巧大全 表格制作excel教程
excel表格操作技巧大全 表格制作excel教程

Excel表格操作的核心技巧在于 熟练使用快捷键、数据处理函数及视图工具,如Ctrl+C/V(复制粘贴)、Alt+=(自动求和)、条件格式、数据验证及数据透视表。掌握这些可大幅提升数据分析与办公效率,实现快速录入、查找、筛选和汇总。

1

2026.01.21

毒蘑菇显卡测试网站入口 毒蘑菇测试官网volumeshader_bm
毒蘑菇显卡测试网站入口 毒蘑菇测试官网volumeshader_bm

毒蘑菇VOLUMESHADER_BM测试网站网址为https://toolwa.com/vsbm/,该平台基于WebGL技术通过渲染高复杂度三维分形图形评估设备图形处理能力,用户可通过拖动彩色物体观察画面流畅度判断GPU与CPU协同性能;测试兼容多种设备,但中低端手机易卡顿或崩溃,高端机型可能因发热降频影响表现,桌面端需启用独立显卡并使用支持WebGL的主流浏览器以确保准确结果

2

2026.01.21

github中文官网入口 github中文版官网网页进入
github中文官网入口 github中文版官网网页进入

github中文官网入口https://docs.github.com/zh/get-started,GitHub 是一种基于云的平台,可在其中存储、共享并与他人一起编写代码。 通过将代码存储在GitHub 上的“存储库”中,你可以: “展示或共享”你的工作。 持续“跟踪和管理”对代码的更改。

2

2026.01.21

windows安全中心怎么关闭打开_windows安全中心操作指南
windows安全中心怎么关闭打开_windows安全中心操作指南

Windows安全中心可以通过系统设置轻松开关。 暂时关闭:打开“设置” -> “隐私和安全性” -> “Windows安全中心” -> “病毒和威胁防护” -> “管理设置”,将“实时保护”关闭。打开:同样路径将开关开启即可。如需彻底关闭,需在组策略(gpedit.msc)或注册表中禁用Windows Defender。

1

2026.01.21

C++游戏开发Unreal Engine_C++怎么用Unreal Engine开发游戏
C++游戏开发Unreal Engine_C++怎么用Unreal Engine开发游戏

虚幻引擎(Unreal Engine, 简称UE)是由Epic Games开发的一款功能强大的工业级3D游戏引擎,以高品质实时渲染(如Nanite和Lumen)闻名 。它基于C++语言,为开发者提供高效率的框架、强大的可视化脚本系统(蓝图)、以及针对PC、主机和移动端的完整开发工具,广泛用于游戏、电影制片等领域。

0

2026.01.21

Python GraphQL API 开发实战
Python GraphQL API 开发实战

本专题系统讲解 Python 在 GraphQL API 开发中的实际应用,涵盖 GraphQL 基础概念、Schema 设计、Query 与 Mutation 实现、权限控制、分页与性能优化,以及与现有 REST 服务和数据库的整合方式。通过完整示例,帮助学习者掌握 使用 Python 构建高扩展性、前后端协作友好的 GraphQL 接口服务,适用于中大型应用与复杂数据查询场景。

1

2026.01.21

云朵浏览器入口合集
云朵浏览器入口合集

本专题整合了云朵浏览器入口合集,阅读专题下面的文章了解更多详细地址。

22

2026.01.20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
golang socket 编程
golang socket 编程

共2课时 | 0.1万人学习

nginx浅谈
nginx浅谈

共15课时 | 0.8万人学习

golang和swoole核心底层分析
golang和swoole核心底层分析

共3课时 | 0.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号