首頁 後端開發 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教學
1655
14
CakePHP 教程
1413
52
Laravel 教程
1306
25
PHP教程
1252
29
C# 教程
1226
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語言並發特性解析 Mar 27, 2024 pm 05:45 PM

Go語言並發特性解析Go語言作為一種由Google開發的開源程式語言,在處理並發程式設計方面擁有獨特的優勢。由於其簡潔、高效和強大的並發機制,Go語言越來越受到開發者的青睞。本文將深入探討Go語言的並發特性,包括goroutine、channel和並發原語,並結合具體的程式碼範例進行解析。一、goroutine在Go語言中,goroutine是其並發的基本單元,

See all articles