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

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

Jun 02, 2024 pm 01:38 PM
go并发 编程场景

并发编程在 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
        }) { }
    }
}
登录后复制

以上是Go并发编程的用例与场景详解的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1657
14
CakePHP 教程
1415
52
Laravel 教程
1309
25
PHP教程
1257
29
C# 教程
1229
24
如何使用Go语言中的并发函数实现多个网页的并行抓取? 如何使用Go语言中的并发函数实现多个网页的并行抓取? Jul 29, 2023 pm 07:13 PM

如何使用Go语言中的并发函数实现多个网页的并行抓取?在现代Web开发中,经常需要从多个网页中抓取数据。一般的做法是逐个发起网络请求并等待响应,这样效率较低。而Go语言提供了强大的并发功能,可以通过并行抓取多个网页来提高效率。本文将介绍如何使用Go语言的并发函数实现多个网页的并行抓取,以及一些注意事项。首先,我们需要使用Go语言内置的go关键字创建并发任务。通

Go语言中如何处理并发数据库连接的故障切换问题? Go语言中如何处理并发数据库连接的故障切换问题? Oct 09, 2023 am 11:33 AM

Go语言中如何处理并发数据库连接的故障切换问题?在处理并发数据库连接时,我们通常会遇到数据库连接的故障切换问题。当一个数据库连接发生故障时,我们需要考虑如何及时切换到一个可用的数据库连接,以确保系统的正常运行。下面将详细介绍在Go语言中如何处理并发数据库连接的故障切换问题,并提供一些具体的代码示例。使用连接池:在Go语言中,我们可以使用连接池来管理数据库连接

提升Go并发性能的最佳实践 提升Go并发性能的最佳实践 Jun 03, 2024 am 09:41 AM

提升Go并发性能的最佳实践:优化Goroutine调度:调整GOMAXPROCS、SetNumGoroutine和SetMaxStack参数以优化性能。使用Channel同步:利用无缓冲和有缓冲channel以安全有效的方式同步协程执行。代码并行化:识别可并行执行的代码块并通过goroutine并行执行它们。减少锁争用:使用读写锁、无锁通信和局部变量以最小化对共享资源的竞争。实战案例:优化图像处理程序的并发性能,通过调整调度器、使用channel和并行处理显着提高了吞吐量。

Go语言并发调度问题解决方案 Go语言并发调度问题解决方案 Jun 30, 2023 pm 12:25 PM

解决Go语言开发中的并发调度问题的方法随着互联网的发展和技术的进步,越来越多的开发者转向了Go语言这种简洁、高效的编程语言。Go语言以其良好的并发性能而闻名,它提供了丰富的并发编程特性,使得开发者可以轻松地实现多任务并发执行。然而,在实际的开发中,我们还是会遇到一些并发调度的问题。本文将介绍一些解决这些问题的方法。Go语言提供了goroutine和chann

优化golang中Select Channels Go并发式编程的性能调优策略 优化golang中Select Channels Go并发式编程的性能调优策略 Sep 28, 2023 pm 09:21 PM

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

深入理解Go语言的并发机制 深入理解Go语言的并发机制 Mar 27, 2024 pm 10:00 PM

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

GO中的高级并发技术:上下文和候补组 GO中的高级并发技术:上下文和候补组 Apr 24, 2025 pm 05:09 PM

contextancandwaitgroupsarecrucialingoformanaginggoroutineseflect.1)context contextsallowsAllowsAllowsAllowsAllowsAllingCancellationAndDeadLinesAcrossapibiboundaries,确保GoroutinesCanbestoppedGrace.2)WaitGroupsSynChronizeGoroutines,确保Allimizegoroutines,确保AllizeNizeGoROutines,确保AllimizeGoroutines

GO的选择语句:多路复用并发操作 GO的选择语句:多路复用并发操作 Apr 24, 2025 pm 05:21 PM

go'SselectStatementTreamLinesConcurrentProgrambyMultiplexingOperations.1)itallowSwaitingOnMultipleChannEloperations,执行thefirstreadyone.2)theDefirstreadyone.2)thedefefcasepreventlocksbysbysbysbysbysbythoplocktrograpraproxrograpraprocrecrecectefnoopeready.3)

See all articles