Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
Goroutines 的工作原理及主进程结束后 Goroutines 的生命周期_创想鸟

Goroutines 的工作原理及主进程结束后 Goroutines 的生命周期

goroutines 的工作原理及主进程结束后 goroutines 的生命周期

Goroutines 是 Go 语言并发编程的核心。理解 Goroutines 的工作方式以及它们在主进程结束后的行为至关重要。本文将深入探讨 Goroutines 的生命周期,以及如何使用 sync.WaitGroup 来确保 Goroutines 完成任务。

Goroutines 的基本概念

Goroutines 本质上是轻量级的线程,由 Go 运行时(runtime)管理。与传统的线程相比,Goroutines 的创建和销毁开销更小,切换速度更快,因此可以在程序中创建大量的 Goroutines 来实现并发执行。

当程序启动时,会创建一个主 Goroutine 来执行 main 函数。可以通过 go 关键字来启动新的 Goroutines,每个 Goroutine 都会并发地执行指定的函数。

package mainimport (    "fmt"    "time")func worker(id int) {    fmt.Printf("Worker %d startingn", id)    time.Sleep(time.Second)    fmt.Printf("Worker %d donen", id)}func main() {    for i := 1; i <= 3; i++ {        go worker(i)    }    // 暂停几秒钟,让 worker 线程有机会运行    time.Sleep(time.Second * 2)}

在这个例子中,main 函数启动了三个 Goroutines,每个 Goroutine 执行 worker 函数。worker 函数会打印一条消息,暂停一秒钟,然后再次打印一条消息。main 函数暂停了两秒钟,以便让 Goroutines 有机会完成执行。

Goroutines 的生命周期

Goroutines 的生命周期始于 go 关键字的调用,终于函数的执行完成。需要注意的是,当 main 函数返回时,程序会立即退出,不会等待其他 Goroutines 完成执行。这意味着,如果 main 函数在 Goroutines 完成之前退出,那么这些 Goroutines 就会被强制终止,可能导致数据丢失或程序状态不一致。

使用 sync.WaitGroup 管理 Goroutines

为了确保 Goroutines 完成任务后再退出程序,可以使用 sync.WaitGroup。sync.WaitGroup 提供了一种简单的机制来等待一组 Goroutines 完成执行。

sync.WaitGroup 的使用步骤如下:

Otter.ai Otter.ai

一个自动的会议记录和笔记工具,会议内容生成和实时转录

Otter.ai 91 查看详情 Otter.ai 创建 sync.WaitGroup 实例:在 main 函数中创建一个 sync.WaitGroup 实例。增加计数器:在启动每个 Goroutine 之前,调用 wg.Add(1) 来增加计数器。标记完成:在每个 Goroutine 的结束处,调用 wg.Done() 来标记完成,减少计数器。等待完成:在 main 函数中,调用 wg.Wait() 来等待计数器归零,即所有 Goroutines 都已完成。

package mainimport (    "fmt"    "sync"    "time")func worker(id int, wg *sync.WaitGroup) {    defer wg.Done() // 确保在函数退出时调用 Done()    fmt.Printf("Worker %d startingn", id)    time.Sleep(time.Second)    fmt.Printf("Worker %d donen", id)}func main() {    var wg sync.WaitGroup    for i := 1; i <= 3; i++ {        wg.Add(1) // 启动一个 worker 线程,增加计数器        go worker(i, &wg)    }    wg.Wait() // 阻塞直到计数器归零    fmt.Println("All workers done")}

在这个例子中,main 函数在启动每个 worker Goroutine 之前调用 wg.Add(1),在 worker 函数的结束处调用 wg.Done()。main 函数调用 wg.Wait() 来等待所有 worker Goroutines 完成执行。

示例:并发插入 MongoDB

以下代码演示了如何使用 Goroutines 和 sync.WaitGroup 并发地向 MongoDB 插入数据。

package mainimport (    "fmt"    "labix.org/v2/mgo"    "strconv"    "sync"    "time")// Reading 结构体type Reading struct {    Id   string    Name string}func main() {    // 设置计时器    startTime := time.Now()    // 设置集合    collection := getCollection("test", "readings")    fmt.Println("collection complete: " + strconv.FormatFloat(time.Since(startTime).Seconds(), 'f', 2, 64))    // 准备 readings    readings := prepareReadings()    fmt.Println("readings prepared: " + strconv.FormatFloat(time.Since(startTime).Seconds(), 'f', 2, 64))    var waitGroup sync.WaitGroup    // 插入 readings    for i := 1; i <= 1000000; i++ {        waitGroup.Add(1)        go insertReadings(collection, readings, &waitGroup)        if i%100000 == 0 {            fmt.Println("100000 readings queued for insert: " + strconv.FormatFloat(time.Since(startTime).Seconds(), 'f', 2, 64))        }    }    waitGroup.Wait()    fmt.Println("all readings inserted: " + strconv.FormatFloat(time.Since(startTime).Seconds(), 'f', 2, 64))}func getCollection(databaseName string, tableName string) *mgo.Collection {    session, err := mgo.Dial("localhost")    if err != nil {        fmt.Println("error getCollection:", err)        panic(err)    }    collection := session.DB(databaseName).C(tableName)    return collection}func insertReadings(collection *mgo.Collection, readings []Reading, waitGroup *sync.WaitGroup) {    defer waitGroup.Done()    err := collection.Insert(readings)    if err != nil {        fmt.Println("error insertReadings:", err)    }}func prepareReadings() []Reading {    var readings []Reading    for i := 1; i <= 1; i++ {        readings = append(readings, Reading{Name: "Thing"})    }    return readings}

在这个例子中,insertReadings 函数接收一个 sync.WaitGroup 指针,并在函数结束时调用 waitGroup.Done()。main 函数在启动每个 insertReadings Goroutine 之前调用 waitGroup.Add(1),并使用 waitGroup.Wait() 等待所有 Goroutines 完成。

注意事项:

确保在每个 Goroutine 中都调用 defer wg.Done(),以避免 Goroutine 提前退出导致程序死锁。在并发访问共享资源时,需要使用互斥锁(sync.Mutex)或其他同步机制来保护数据的一致性。

总结

Goroutines 是 Go 语言并发编程的强大工具。通过理解 Goroutines 的生命周期以及如何使用 sync.WaitGroup,可以编写出高效、可靠的并发程序。在实际开发中,需要根据具体情况选择合适的并发模型,并注意数据同步和资源竞争的问题。

以上就是Goroutines 的工作原理及主进程结束后 Goroutines 的生命周期的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1135405.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
STS安装Activiti插件指南
上一篇 2025年12月2日 17:45:03
Vue项目中,main.js引入scss文件报错的原因是什么?
下一篇 2025年12月2日 17:45:07

相关推荐

  • Vscode怎么批量修改变量?Vscode变量重命名操作指南

    Vscode怎么批量修改变量?Vscode变量重命名操作指南Vscode怎么批量修改变量?Vscode变量重命名操作指南Vscode怎么批量修改变量?Vscode变量重命名操作指南Vscode怎么批量修改变量?Vscode变量重命名操作指南

    vscode批量修改变量的方法是选中变量按f2输入新名回车,但要更精确控制重命名范围可采取以下措施:1.使用“查找和替换”功能(ctrl+h),结合正则表达式限定匹配范围;2.使用语言支持的“重构”功能(右键→重构→重命名),基于语义分析避免误改;3.安装增强重命名插件提升功能;4.利用静态代码分析…

    2026年9月23日 用户投稿
    000
  • Java中用户输入验证:正确使用equals()或转换为整数进行比较

    本教程详细阐述了Java中用户输入字符串(如菜单选项)验证的正确方法。针对==运算符在字符串比较中的局限性,文章介绍了两种解决方案:一是使用String.equals()方法进行内容比较,二是将字符串输入解析为整数后进行数值比较。通过代码示例,帮助开发者避免常见的字符串比较错误,确保程序逻辑的健壮性…

    2026年9月23日
    000
  • 空洞骑士丝之歌可以联机吗 联机功能情况说明​

    空洞骑士丝之歌目前无法进行联机游戏,尽管官方尚未正式声明,但游戏中并未设置多人在线模式或服务器支持功能。同时,剧情发展、地图结构等内容均围绕主角大黄蜂独立构建,未提供其他可操作角色,因此不具备联机游玩的基础条件。 关于空洞骑士丝之歌是否支持联机的详细说明如下: 一、当前联机状态明确 截至目前,本作不…

    2026年9月23日
    000
  • 微软免费文件恢复工具介绍

    微软免费文件恢复工具介绍微软免费文件恢复工具介绍微软免费文件恢复工具介绍微软免费文件恢复工具介绍

    现在好了,最近微软在 windows 10 应用商店中上架了一款免费的数据删除恢复工具 windows file recovery,猿妹再也不用担心误删文件了。 Windows File Recovery基于命令行程序设计,大小仅有8.26MB,所有Windows 10用户均可免费下载使用。 无论是…

    2026年9月23日 用户投稿
    000
  • 淘宝评价显示延迟怎么办 淘宝评价刷新与修复技巧

    先检查网络与应用状态,确认手机网络稳定并清理淘宝App缓存,避免因本地问题导致评价加载延迟。 淘宝评价显示延迟,通常不会持续太久,但确实会影响购物决策。核心是先判断是局部问题还是普遍现象,然后针对性地处理。 检查网络与应用状态 评价加载不出来,大概率是本地环境的问题。先确认你的手机网络是否稳定,可以…

    2026年9月23日
    000
  • VSCode精简配置Perl:语法检查、中文编码、正则调试

    vscode中perl语法检查不生效的主要原因是perl解释器路径未正确配置或缺失,解决方法是在settings.json中明确设置”perl.perlpath”指向正确的perl可执行文件;其次是因缺少cpan模块导致检查失败,需安装对应模块;此外,多个perl扩展冲突、大…

    2026年9月23日
    000
  • Yandex对俄贸易专用搜索 官方网站入口一键直达

    Yandex对俄贸易专用搜索官网为https://yandex.com/,提供俄语内容索引、企业信息查找、地图定位及自动翻译等功能,支持跨境业务拓展与市场分析。 Yandex对俄贸易专用搜索官方网站入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来Yandex对俄贸易专用搜索官方网站入口…

    2026年9月23日
    300
  • AO3镜像站直接访问链接_AO3镜像站推荐镜像站点

    AO3镜像站直接访问链接包括https://archiveofourown.org/、https://ao3.cubeart.club/、https://l.ao4.live、https://s.ao3l.live,用户可通过浏览器直接输入网址访问,主站无法加载时可切换镜像站点,部分支持手机浏览且无…

    2026年9月23日
    000
  • AfterEffects如何制作AI动效视频?创建动态AI视频的完整教程

    AfterEffects如何制作AI动效视频?创建动态AI视频的完整教程AfterEffects如何制作AI动效视频?创建动态AI视频的完整教程AfterEffects如何制作AI动效视频?创建动态AI视频的完整教程AfterEffects如何制作AI动效视频?创建动态AI视频的完整教程

    答案是掌握AE动画原理并融合AI素材进行创作。需根据风格选择合适AI工具(如Midjourney、RunwayML),注重素材质量、可定制性与透明背景支持;将AI素材导入AE后,调整分辨率,运用颜色校正、模糊、跟踪及表达式增强效果;通过关键帧控制位置、缩放、旋转,并应用缓动实现流畅动画;搭配契合主题…

    2026年9月23日 用户投稿
    200
  • 如何在Java中安装Eclipse开发环境

    先安装JDK并配置环境变量,再下载安装Eclipse IDE。1. 安装JDK:从Oracle或Eclipse Adoptium下载JDK 17/21,按提示安装,设置JAVA_HOME和PATH,用java -version验证。2. 安装Eclipse:官网下载“Eclipse IDE for …

    2026年9月23日
    000
  • 配置Linux下vim自动缩进

    从终端打开配置文件: vim ~/.vimrc 添加如下代码: set tabstop=4set softtabstop=4set shiftwidth=4set autoindentset cindentset cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1…

    2026年9月23日
    800
  • 2025 旗舰手机选购指南:四款机型精准匹配你的需求

    2025 旗舰手机选购指南:四款机型精准匹配你的需求2025 旗舰手机选购指南:四款机型精准匹配你的需求2025 旗舰手机选购指南:四款机型精准匹配你的需求2025 旗舰手机选购指南:四款机型精准匹配你的需求

    在智能手机市场持续繁荣的今天,面对琳琅满目的旗舰%ignore_a_1%,用户往往难以抉择。本文精选四款当前热门的高端手机,帮你高效锁定心仪之选。 1 五款旗舰机型推荐 1. OPPO Find X9 系列 大容量电池、护眼显示屏、双 2 亿像素影像系统——适合对续航敏感、热爱摄影以及重视视觉健康的…

    2026年9月23日 用户投稿
    200
  • PHP多维数组重构:按指定键分组数据

    本文旨在指导读者如何将一个包含多个关联数组的扁平数组,根据其中某个特定键(如object_type)的值,重构为一个多维数组。通过遍历原始数据并动态构建新结构,最终实现数据按指定键值进行高效分组,以便于后续的数据处理和管理。 1. 引言与问题背景 在PHP开发中,我们经常会遇到需要处理和转换数组结构…

    2026年9月23日
    000
  • VSCode如何实现AI辅助编程 VSCode Copilot插件的深度使用指南

    github copilot能显著提升编程效率,但需合理使用。1. 安装插件并登录github账号是基础步骤;2. 提供清晰的上下文,如规范命名和详细注释,可提高生成代码的准确性;3. 利用快捷键切换多个建议,筛选最优方案并进行修改;4. 对生成代码必须严格审查,尤其关注安全性与业务逻辑匹配度;5.…

    2026年9月23日
    100
  • 抖音ai分身怎么弄出来?抖音分身在哪里打开

    随着人工智能技术不断发展,其应用已经深入到我们日常生活的诸多领域。作为当前热门的短视频平台之一,抖音也推出了AI分身功能,让用户可以轻松创建属于自己的虚拟形象。本文将为您详细介绍抖音AI分身的操作方法,助您在抖音平台上脱颖而出! 一、了解抖音AI分身 抖音AI分身是一项基于人工智能算法打造的特效功能…

    2026年9月23日
    000
  • Java岗大厂面试百日冲刺 – 日积月累,每日三题【Day25】—— JVM1

    Java岗大厂面试百日冲刺 – 日积月累,每日三题【Day25】—— JVM1Java岗大厂面试百日冲刺 – 日积月累,每日三题【Day25】—— JVM1Java岗大厂面试百日冲刺 – 日积月累,每日三题【Day25】—— JVM1Java岗大厂面试百日冲刺 – 日积月累,每日三题【Day25】—— JVM1

    车票 面试题1:你遇到过哪些OOM情况,什么原因造成的?怎么解决的? 该问题主要针对你遇到的实际问题出发,可以根据你实际遇到过的情况和场景,结合下面每种情况的具体原因和解决方式,整理后回答。 当堆内存(Heap Space)没有足够空间存放新创建的对象时,就会抛出 java.lang.OutOfMe…

    2026年9月23日 用户投稿
    000
  • 番茄小说怎么清除浏览记录_番茄小说浏览记录清除操作教程

    可通过应用内设置一键清空浏览记录,或左滑删除特定书籍历史;也可通过手机设置清除缓存或数据来彻底移除阅读痕迹。 如果您在使用番茄小说时希望保护个人隐私,避免他人查看您的阅读历史,可以通过以下方法清除浏览记录。以下是具体的操作步骤: 一、通过应用内设置清除浏览记录 番茄小说提供了内置的清除功能,用户可以…

    2026年9月23日
    800
  • 如何用PhotoPosPro的AI裁剪图片?快速实现智能裁剪的教程

    PhotoPosPro的AI裁剪功能可自动识别图片主体并裁剪边缘,适合快速处理或构图新手。打开图片后,在“Image”或“Tools”菜单中找到“AI Crop”工具,可选裁剪比例或让软件自动判断,点击“Apply”运行AI裁剪。完成后可手动微调裁剪框,满意后保存。若效果不佳,可尝试手动调整、切换A…

    2026年9月23日
    200
  • win11怎么进入BIOS设置界面_win11进入BIOS界面操作教程

    首先通过高级启动选项进入BIOS,适用于无法使用快捷键的情况:打开设置→系统→恢复→立即重新启动→疑难解答→高级选项→UEFI固件设置→重启进入BIOS;其次可在开机时按品牌特定快捷键,如联想按F2或Fn+F2、戴尔F2、惠普ESC、华硕与技嘉Del键;此外部分联想设备支持NOVO按钮,在关机状态下…

    2026年9月23日
    100
  • 为什么Java中构造方法重要 如何正确编写构造方法

    构造方法确保对象正确初始化:通过强制赋初值、校验数据、支持封装和重载提升灵活性;编写时需遵循命名一致、无返回类型、合理用参、注意访问修饰符、避免复杂逻辑及善用this()调用;常见误区包括忽略无参构造、过度初始化和异常处理不当。 构造方法在Java中扮演着初始化对象的关键角色。创建对象时,构造方法会…

    2026年9月23日
    000

发表回复

登录后才能评论
关注微信