新闻中心

如何在Golang中实现基础的goroutine并发执行_Golang goroutine并发执行方法汇总

2025-11-19
浏览次数:
返回列表
Goroutine是Go并发核心,通过go关键字启动轻量级线程,配合WaitGroup同步、channel通信、select多路复用及Mutex保护共享资源,实现高效安全并发。

如何在golang中实现基础的goroutine并发执行_golang goroutine并发执行方法汇总

在Golang中,goroutine 是实现并发的核心机制。它是一种轻量级线程,由Go运行时管理,启动成本低,适合高并发场景。下面介绍几种基础且实用的goroutine并发执行方法。

1. 启动基本goroutine

使用 go 关键字即可启动一个goroutine,函数会异步执行。

示例:
package main
<p>import (
"fmt"
"time"
)</p><p>func sayHello() {
fmt.Println("Hello from goroutine")
}</p><p>func main() {
go sayHello()
time.Sleep(100 * time.Millisecond) // 等待goroutine执行
fmt.Println("Main function")
}

注意:主函数退出后,所有goroutine都会终止,因此需要适当同步(如Sleep或WaitGroup)来确保执行完成。

2. 使用sync.WaitGroup等待多个goroutine

当需要等待一组goroutine完成时,sync.WaitGroup 是最常用的同步工具。

示例:
package main
<p>import (
"fmt"
"sync"
)</p><p>func worker(id int, wg *sync.WaitGroup) {
defer wg.Done()
fmt.Printf("Worker %d starting\n", id)
// 模拟任务耗时
fmt.Printf("Worker %d done\n", id)
}</p><p>func main() {
var wg sync.WaitGroup</p><pre class="brush:php;toolbar:false;">for i := 1; i <= 3; i++ {
    wg.Add(1)
    go worker(i, &wg)
}

wg.Wait() // 阻塞直到所有worker调用Done()
fmt.Println("All workers finished")

}

3. 使用channel进行goroutine通信

Go提倡“通过通信共享内存”,channel 是goroutine之间安全传递数据的方式。

示例:通过channel接收结果
package main
<p>import "fmt"</p>
                    <div class="aritcle_card">
                        <a class="aritcle_card_img" href="/ai/855">
                            <img src="https://img.php.cn/upload/ai_manual/001/503/042/68b6d67adc5da910.png" alt="Whimsical">
                        </a>
                        <div class="aritcle_card_info">
                            <a href="/ai/855">Whimsical</a>
                            <p>Whimsical推出的AI思维导图工具</p>
                            <div class="">
                                <img src="/static/images/card_xiazai.png" alt="Whimsical">
                                <span>182</span>
                            </div>
                        </div>
                        <a href="/ai/855" class="aritcle_card_btn">
                            <span>查看详情</span>
                            <img src="/static/images/cardxiayige-3.png" alt="Whimsical">
                        </a>
                    </div>
                <p>func fetchData(ch chan string) {
ch <- "data from goroutine"
}</p><p>func main() {
ch := make(chan string)
go fetchData(ch)
result := <-ch // 从channel读取数据
fmt.Println(result)
}

无缓冲channel会阻塞发送和接收,直到双方就绪;有缓冲channel可缓解短暂速度差异。

4. 使用select处理多个channel

当需要从多个channel中接收数据时,select 可以实现多路复用。

示例:
package main
<p>import (
"fmt"
"time"
)</p><p>func sendMsg(ch chan string, msg string, delay time.Duration) {
time.Sleep(delay)
ch <- msg
}</p><p>func main() {
ch1 := make(chan string)
ch2 := make(chan string)</p><pre class="brush:php;toolbar:false;">go sendMsg(ch1, "msg from 1", 100*time.Millisecond)
go sendMsg(ch2, "msg from 2", 200*time.Millisecond)

for i := 0; i < 2; i++ {
    select {
    case msg := <-ch1:
        fmt.Println(msg)
    case msg := <-ch2:
        fmt.Println(msg)
    }
}

}

5. 避免常见并发问题

goroutine虽简单,但共享变量可能引发竞态条件。建议:

  • 避免多个goroutine直接读写同一变量
  • 使用channel传递数据而非共享内存
  • 必要时使用 sync.Mutex 保护临界区
示例:使用Mutex保护计数器
package main
<p>import (
"sync"
)</p><p>var counter int
var mu sync.Mutex</p><p>func increment(wg *sync.WaitGroup) {
defer wg.Done()
mu.Lock()
counter++
mu.Unlock()
}

基本上就这些。掌握这些基础方法,就能在Go中高效、安全地使用goroutine实现并发。关键是理解goroutine生命周期、同步机制和channel的使用场景。

以上就是如何在Golang中实现基础的goroutine并发执行_Golang goroutine并发执行方法汇总的详细内容,更多请关注其它相关文章!


# 中文网  # 南安百度seo推广  # 泸州网站推广多少钱  # 建委诚信网站建设方案  # 北京exw外贸网站建设  # 南通营销推广途径哪些地方  # 福田教育网站推广哪个好  # seo工作日志文库  # seo执行力到位教学  # 笔芯传媒 左手公关右手SEO  # 浉河区优化推广营销  # 正则表达式  # 几种  # go  # 相关文章  # 能在  # 它是  # 复用  # 多路  # 如何在  # 多个  # 同步机制  # ai  # 工具  # golang 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Win11网速慢怎么解决 Win11网络设置优化解除限速  J*a TimerTask中HashMap意外清空的深层原因与解决方案  PySpark中从现有列右侧提取可变长度字符创建新列的教程  在J*aScript中复现SciPy的B样条拟合与求值:关键考量  Win11怎么开启省电模式_Win11电池节电模式自动开启  Lar*el递归关系中排除子孙节点的策略  铁路12306改签能改到更早的车次吗_铁路12306改签提前车次规则  React Hooks最佳实践:动态组件状态管理的组件化方案  Win11输入法不见了怎么办_Windows11恢复语言栏显示方法  qq浏览器打开空白页怎么办 qq浏览器启动后显示白屏的解决教程  Win10文件资源管理器“此电脑”分组怎么关 Win10恢复经典视图【技巧】  在Blazor WebAssembly应用中动态注入客户端特定指标代码的策略  J*a递归快速排序中静态变量导致数据累积的陷阱与解决方案  Go语言JSON解析深度指南:动态访问与结构体映射实践  解决macOS Tkinter应用双击启动崩溃:PyInstaller打包指南  淘宝网网页版登录入口 淘宝官方网页版快捷登录  冬*霸灯泡不亮怎么办_浴霸取暖灯一盏不亮的灯座清洁修复法  2026年CSGO开箱网站推荐 CSGO开箱平台精选  qq游戏免费畅玩入口_qq游戏电脑版快速启动  HTML空白字符处理机制:渲染、DOM与编码实践  如何在Promise链中优雅地中断后续then执行  QQ邮箱登录官网首页 腾讯QQ邮箱网页入口  抖音隐秘迷城小游戏入口_ 抖音冒险解谜小游戏秒玩  PHP中高效并行检查多链接状态的教程  铃兰之剑为这和平的世界希里技能组及加点推荐  2025AO3夸克浏览器通道_AO3手机HTTPS安全入口分享  J*aScript中正确使用querySelectorAll与复杂CSS选择器  Python大型XML文件高效流式解析教程  C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图  EMS快递官网app_中国邮政速递物流手机客户端  12306选座怎么选到特殊座位_12306特殊座位选择注意事项  离线运行Go语言之旅:本地部署与GOPATH配置指南  CSS图片焦点样式实现教程:理解与应用tabindex属性  c++如何使用折叠表达式(Fold Expressions)_c++17可变参数模板新技巧  押井守高度称赞《辐射4》:玩了八年都停不下来!  sublime如何只显示或隐藏特定类型文件_sublime侧边栏文件过滤  天猫双十一预售商品怎么退款_天猫双十一预售退款操作指南  Golang如何通过reflect获取匿名字段方法_Golang reflect匿名字段方法访问技巧  邮政编码查询不到怎么办_邮政编码查询不到的常见原因与对策  Django通过AJAX异步上传图片并保存至模型的完整指南  厨房不锈钢水槽发黑生锈怎么处理_水槽用可乐+锡纸2分钟抛亮如新  解决Django多数据库/多Schema环境下外键迁移问题  如何修改开机登录密码_Windows账户安全设置超详细教程【必学】  处理Kafka消费者会话超时:深入理解消息处理语义与幂等性  TikTok国际版网页端快速入口 TikTok全球版短视频浏览教程  百度浏览器字体显示异常偏小_百度浏览器字体渲染修复方案  J*aScript动态修改指定div内所有a标签样式指南  在Go Martini框架中高效服务动态生成图像的实践指南  Adobe PDF表单中利用J*aScript解析与格式化日期组件的教程  Node.js CSV 数据处理:基于字段值条件过滤整条记录的策略 

搜索