> 백엔드 개발 > Golang > Go 동시 프로그래밍의 사용 사례 및 시나리오에 대한 자세한 설명

Go 동시 프로그래밍의 사용 사례 및 시나리오에 대한 자세한 설명

WBOY
풀어 주다: 2024-06-02 13:38:56
원래의
574명이 탐색했습니다.

Go through goroutine에서는 동시 프로그래밍이 구현되어 여러 작업을 동시에 실행할 수 있어 효율성이 향상됩니다. 사용 사례는 다음과 같습니다. 병렬 처리 이벤트 처리 I/O 집약적 작업 HTTP 서비스 작업 스케줄링

Go 동시 프로그래밍의 사용 사례 및 시나리오에 대한 자세한 설명

Go 동시 프로그래밍의 사용 사례 및 시나리오에 대한 자세한 설명

소개
동시 프로그래밍은 다음을 허용하는 프로그래밍 패러다임입니다. 우리는 여러 작업을 동시에 수행합니다. Go 언어에서는 경량 스레드인 고루틴을 통해 동시 프로그래밍이 구현됩니다. 이 기사에서는 Go에서 동시 프로그래밍의 사용 사례와 시나리오를 살펴보고 실제 예제를 제공합니다.

사용 사례 및 시나리오

1. 병렬 처리

  • 큰 작업을 더 작은 하위 작업으로 나누고 병렬로 처리하여 효율성을 높입니다.
  • 예: 고루틴을 사용하여 이미지 처리 작업을 병렬화합니다.

2. 이벤트 처리

  • 들어오는 이벤트를 듣고 goroutine을 사용하여 각 이벤트를 병렬로 처리합니다.
  • 예: Goroutine을 사용하여 WebSocket 연결에서 들어오는 메시지를 처리합니다.

3. I/O 집약적인 작업

  • 파일 읽기나 네트워크 호출과 같은 I/O 집약적인 작업의 경우 고루틴을 사용하면 성능이 향상될 수 있습니다.
  • 예: 고루틴을 사용하여 여러 파일의 데이터를 병렬로 읽습니다.

4. HTTP 서비스

  • HTTP 서비스에서 고루틴을 사용하여 들어오는 요청을 처리하면 동시성을 향상시킬 수 있습니다.
  • 예: 고루틴을 사용하여 웹 서버에서 들어오는 HTTP 요청을 처리합니다.

5. 작업 예약

  • 고루틴을 사용하여 특정 시간이나 주기적으로 실행해야 하는 작업을 관리하고 예약하세요.
  • 예: 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿