当前位置:

首页 > 编程开发 > Go并发编程的用例与场景详解

Go并发编程的用例与场景详解

并发编程在Go中通过goroutine实现,允许同时执行多个任务,提高效率。其用例包括:并行处理事件处理I/O密集型操作HTTP服务任务调度

本文目录

    并发编程在 Go 中通过 goroutine 实现,允许同时执行多个任务,提高效率。其用例包括:并行处理事件处理I/O 密集型操作HTTP 服务任务调度

    Go并发编程的用例与场景详解

    Go 并发编程的用例与场景详解

    简介
    并发编程是一种编程范式,它允许我们同时执行多个任务。在 Go 语言中,并发编程通过 goroutine 实现,goroutine 是轻量级线程。本篇文章将探讨 Go 中并发编程的用例和场景,并提供实际示例。

    用例和场景

    1. 并行处理

    • 将大型任务分解为较小的子任务并并行处理它们,以提高效率。
    • 示例:使用 Goroutines paralleize 图片处理任务。

    2. 事件处理

    • 监听传入事件并使用 goroutine 并行处理每个事件。
    • 示例:使用 Goroutines 处理来自 WebSocket 连接的传入消息。

    3. I/O 密集型操作

    • 对于 I/O 密集型操作,例如文件读取或网络调用,使用 Goroutines 可以提高性能。
    • 示例:使用 Goroutines 从多个文件中并行读取数据。

    4. HTTP 服务

    • 在 HTTP 服务中,使用 Goroutines 处理传入请求可以提高并发性。
    • 示例:用 Goroutines 处理来自 Web 服务器的传入 HTTP 请求。

    5. 任务调度

    • 使用 Goroutines 管理和调度需要在特定时间或周期性执行的任务。
    • 示例:使用 Goroutine 实现 Cron 定时器来调度作业。

    实战示例

    示例 1:并发图片处理

    package main
    
    import (
        "fmt"
        "image"
        "image/color"
        "image/draw"
        "runtime"
    )
    
    func main() {
        width, height := 1000, 1000
        images := []image.Image{}
    
        // 并行创建 100 个图像
        for i := 0; i < 100; i++ {
            img := image.NewRGBA(image.Rect(0, 0, width, height))
            draw.Draw(img, img.Bounds(), &image.Uniform{color.RGBA{0, 0, 0, 255}}, image.ZP, draw.Src)
            images = append(images, img)
        }
    
        // 计算创建图像所花费的时间
        numCPUs := runtime.NumCPU()
        start := time.Now()
        for i := 0; i < 100; i++ {
            go createImage(images[i])
        }
    
        // 等待所有 Goroutine 完成
        time.Sleep(10 * time.Second)
        elapsed := time.Since(start)
        fmt.Printf("Creating %d images using %d CPUs took %s\n", len(images), numCPUs, elapsed)
    }
    
    func createImage(img image.Image) {
        // 模拟耗时的图像处理操作
        time.Sleep(500 * time.Millisecond)
    }

    示例 2:处理 WebSocket 消息

    package main
    
    import (
        "errors"
        "fmt"
        "net/http"
        "sync/atomic"
    
        "github.com/gorilla/websocket"
    )
    
    type client struct {
        conn *websocket.Conn
        name string
    }
    
    var (
        upgrader = websocket.Upgrader{}
        messages = make(chan string)
    )
    
    var connectedClients uint64
    
    func main() {
        http.HandleFunc("/websocket", serveWebSocket)
    
        // 启动 Goroutine 来处理传入消息
        go handleMessage()
    
        if err := http.ListenAndServe(":8080", nil); err != nil {
            fmt.Println(err)
        }
    }
    
    func serveWebSocket(w http.ResponseWriter, r *http.Request) {
        conn, err := upgrader.Upgrade(w, r, nil)
        if err != nil {
            fmt.Println(err)
            return
        }
    
        atomic.AddUint64(&connectedClients, 1)
    
        go handleConnection(conn)
    }
    
    func handleConnection(conn *websocket.Conn) {
        defer func() {
            conn.Close()
            atomic.AddUint64(&connectedClients, -1)
        }()
    
        // 监听来自客户端的消息
        for {
            _, message, err := conn.ReadMessage()
            if err != nil {
                if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) {
                    fmt.Println(err)
                }
                return
            }
    
            messages <- message
        }
    }
    
    func handleMessage() {
        for message := range messages {
            // 处理消息逻辑
            fmt.Println("Received message:", message)
    
            // 例如,将消息广播给所有已连接的客户端
            for clients.Range(func(_, v interface{}) bool {
                client := v.(client)
                if err := client.conn.WriteMessage(websocket.TextMessage, []byte(message)); err != nil {
                    if errors.Is(err, websocket.ErrCloseSent) {
                        clients.Delete(client.name)
                        fmt.Printf("Client %s disconnected\n", client.name)
                    }
                }
                return true
            }) { }
        }
    }
    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    深入理解Go语言的并发机制
    深入理解Go语言的并发机制

    深入理解Go语言的并发机制在Go语言中,通过goroutine和channel实现并发是一种非常高效和简洁的方式。并发是指程序中的多个任务可以同时执行,而不需要等待其它任务结束。通过利用CPU的多核资源,可以提高程序的运行效率。本文将深入探讨Go语言并发机制,并通过具体的代码示例来帮助读者更好地理解。一、goroutine在Go语言中,goroutine是一

    Go语言并发特性解析
    Go语言并发特性解析

    Go语言并发特性解析Go语言作为一种由Google开发的开源编程语言,在处理并发编程方面拥有独特的优势。由于其简洁、高效和强大的并发机制,Go语言越来越受到开发者的青睐。本文将深入探讨Go语言的并发特性,包括goroutine、channel和并发原语,并结合具体的代码示例进行解析。一、goroutine在Go语言中,goroutine是其并发的基本单元,

    优化golang中Select Channels Go并发式编程的性能调优策略
    优化golang中Select Channels Go并发式编程的性能调优策略

    优化golang中SelectChannelsGo并发式编程的性能调优策略引言:随着现代计算机处理器的多核心和并行计算能力的提高,Go语言作为一门并发式编程语言,被广泛采用来开发高并发的后端服务。在Go语言中,使用goroutine和channel可以轻松实现并发编程,提高程序的性能和响应速度。而在并发编程中,使用select语句与channel配合使用

    如何开启Visual Studio2022实时代码分析警告提示
    如何开启Visual Studio2022实时代码分析警告提示

    解决 Visual Studio 2022 编辑时不显示代码分析警告的问题。指南涵盖 .NET 项目实时分析设置、Roslyn 分析器范围调整及错误列表来源筛选,确保开发者能高效利用实时代码诊断功能。

    如何在Visual Studio2022查看变量监视窗口调试程序
    如何在Visual Studio2022查看变量监视窗口调试程序

    详解 Visual Studio 2022 调试技巧:包括断点设置、监视窗口开启方法、变量添加步骤以及通过 F10 单步执行观察变量值变化的全过程。

    Visual Studio2017设置默认编码为UTF-8不带BOM
    Visual Studio2017设置默认编码为UTF-8不带BOM

    针对 Visual Studio 2017 缺乏全局默认编码选项的情况,详解如何利用 .editorconfig 设定项目级 UTF-8 无 BOM 规则,以及手动转换现有文件并校验字节的方法。

    Visual Studio2022F5调试提示启动项目未配置怎么修复
    Visual Studio2022F5调试提示启动项目未配置怎么修复

    解决 Visual Studio 2022 F5 调试报错问题,通过设置启动项目、检查解决方案属性及正确区分类库与应用项目,快速恢复调试功能。

    Visual Studio2022NuGet包还原失败离线处理方案
    Visual Studio2022NuGet包还原失败离线处理方案

    解决Visual Studio 2022离线环境中NuGet包还原失败的难题,涵盖依赖链分析、本地源配置、包集收集及隔离验证步骤,帮助开发者构建稳定的离线开发环境。

    Visual Studio2017大项目加载缓慢,优化加载性能技巧
    Visual Studio2017大项目加载缓慢,优化加载性能技巧

    解决Visual Studio 2017大型项目加载慢的实用指南。涵盖性能监测、扩展管理、文档恢复优化及版本兼容性检查,帮助开发者精准定位瓶颈并提升工作效率。

    Visual Studio2022设置多启动项目同时调试运行
    Visual Studio2022设置多启动项目同时调试运行

    详解 Visual Studio 2022 多启动项目配置方法,包括启动动作选择、顺序调整及调试技巧,帮助开发者高效调试分布式或前后端分离应用。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。