Go并发编程:goroutine与channel实战

简介: Go并发编程:goroutine与channel实战

Go并发编程:goroutine与channel实战

Go语言最令人称道的特性莫过于其原生的并发支持。今天我们来探讨两个核心概念:goroutine和channel,它们共同构成了Go高效的并发模型。

轻量级线程:goroutine

与传统线程相比,goroutine更加轻量,创建成本极低。只需在函数调用前加上go关键字,即可启动一个并发执行单元:

go func() {
   
    fmt.Println("我在并发执行!")
}()

安全的通信:channel

goroutine之间通过channel进行通信,遵循“不要通过共享内存来通信,而要通过通信来共享内存”的理念:

ch := make(chan int, 10) // 创建缓冲大小为10的channel

// 发送数据
ch <- 42

// 接收数据
value := <-ch

实战示例:并发爬虫

下面是一个简单的并发爬虫示例,展示如何协调多个goroutine:

func worker(urls <-chan string, results chan<- string) {
   
    for url := range urls {
   
        // 模拟抓取逻辑
        results <- fmt.Sprintf("抓取完成: %s", url)
    }
}

func main() {
   
    urls := make(chan string, 100)
    results := make(chan string, 100)

    // 启动3个worker
    for i := 0; i < 3; i++ {
   
        go worker(urls, results)
    }

    // 发送任务
    go func() {
   
        for _, url := range urlList {
   
            urls <- url
        }
        close(urls)
    }()

    // 收集结果
    for i := 0; i < len(urlList); i++ {
   
        fmt.Println(<-results)
    }
}

最佳实践

  1. 合理设置channel缓冲大小,平衡内存与性能
  2. 始终确保channel被正确关闭,避免goroutine泄露
  3. 使用select语句处理多个channel操作
  4. 考虑使用context包实现超时和取消机制

Go的并发模型简洁而强大,正确使用goroutine和channel,可以轻松构建高性能的并发应用,同时保持代码的清晰可维护。这正是Go在云原生时代备受青睐的原因之一。

相关文章
|
Prometheus 网络协议 JavaScript
api 网关 kong 数据库记录请求响应报文
Kong的tcp-log-with-body插件是一个高效的工具,它能够转发Kong处理的请求和响应。这个插件非常适用于需要详细记录API请求和响应信息的情景,尤其是在调试和排查问题时。
576 0
api 网关 kong 数据库记录请求响应报文
|
20天前
|
人工智能 BI 项目管理
Claude Opus 4.6前景分析:实力能撑得起期待吗?
Claude Opus 4.6以100万token超长上下文、多Agent协同与低幻觉见长,显著提升文档处理、项目管理与专业场景(法律/金融)实用性;但面临GPT-4o、Gemini等强竞品、高成本及生态短板挑战。实用主义AI新标杆,落地需稳扎稳打。(239字)
|
3月前
|
SQL 机器学习/深度学习 运维
MLflow / Feast 实战手记:MLOps 不是装工具,是治内伤
MLflow / Feast 实战手记:MLOps 不是装工具,是治内伤
194 13
|
Go
Golang语言之gRPC程序设计示例
这篇文章是关于Golang语言使用gRPC进行程序设计的详细教程,涵盖了RPC协议的介绍、gRPC环境的搭建、Protocol Buffers的使用、gRPC服务的编写和通信示例。
654 3
Golang语言之gRPC程序设计示例
|
Prometheus 监控 Cloud Native
Prometheus配置docker采集器
本文介绍了如何使用 Prometheus 监控 Docker 容器,涵盖环境准备、配置文件编写及服务启动等步骤。首先确保安装 Docker 和 Docker Compose,接着通过 `docker-compose.yml` 配置 Prometheus 和示例应用。创建 `prometheus.yml` 指定数据采集目标,最后用 `docker-compose up -d` 启动服务。文章还展示了甘特图和类图,帮助理解服务状态与关系,助力提升系统可靠性和可维护性。
547 11
|
前端开发 Docker 容器
写作利器,一款极简的Markdown 编辑器
WeChat Markdown Editor 是一款高度简洁的微信 Markdown 编辑器:支持 Markdown 语法、色盘取色、多图上传、一键下载文档、自定义 CSS 样式、一键重置等特性。
762 70
写作利器,一款极简的Markdown 编辑器
|
Go API 数据库
Go 语言中常用的 ORM 框架,如 GORM、XORM 和 BeeORM,分析了它们的特点、优势及不足,并从功能特性、性能表现、易用性和社区活跃度等方面进行了比较,旨在帮助开发者根据项目需求选择合适的 ORM 框架。
本文介绍了 Go 语言中常用的 ORM 框架,如 GORM、XORM 和 BeeORM,分析了它们的特点、优势及不足,并从功能特性、性能表现、易用性和社区活跃度等方面进行了比较,旨在帮助开发者根据项目需求选择合适的 ORM 框架。
1527 4
|
Nacos 微服务
【Seata】初识Seata
Seata是 2019 年 1 月份蚂蚁金服和阿里巴巴共同开源的分布式事务解决方案。致力于提供高性能和简单易用的分布式事务服务,为用户打造一站式的分布式解决方案。
567 0
|
消息中间件 设计模式 Java
聊聊 Kafka: Consumer 源码解析之 Rebalance 机制
聊聊 Kafka: Consumer 源码解析之 Rebalance 机制
1059 0
|
NoSQL 关系型数据库 Go
带你十天轻松搞定 Go 微服务系列(一)
带你十天轻松搞定 Go 微服务系列(一)

热门文章

最新文章

下一篇
开通oss服务