>  기사  >  백엔드 개발  >  golang 함수와 goroutine 간의 동기화 메커니즘

golang 함수와 goroutine 간의 동기화 메커니즘

王林
王林원래의
2024-04-26 09:42:01929검색

Go의 동기화 메커니즘에는 다음이 포함됩니다. 채널: 보내기 및 받기 작업 차단을 사용하여 Goroutines 간에 데이터를 안전하게 전송하는 데 사용됩니다. 뮤텍스 잠금: 동시에 하나의 고루틴만 공유 리소스에 액세스할 수 있도록 합니다. 대기 그룹: 완료를 기다리는 고루틴 수를 추적합니다. 이 메커니즘을 통해 기본 고루틴은 실행을 계속하기 전에 모든 고루틴이 완료될 때까지 기다릴 수 있습니다.

golang 함수와 goroutine 간의 동기화 메커니즘

Go에서 함수와 고루틴의 동기화 메커니즘

Go에서 함수와 고루틴은 동시 실행 단위입니다. 이들 간의 조정과 데이터 무결성을 보장하려면 동기화 메커니즘이 필요합니다. 이 글에서는 Go에서 일반적으로 사용되는 동기화 메커니즘을 소개하고 실제 사례를 제공합니다.

Channel

채널은 고루틴 간 데이터를 안전하게 전송하는 데 사용되는 버퍼입니다. 채널의 전송 작업(ch )과 수신 작업(<code>v := )은 모두 차단됩니다. 즉, 송신자는 채널에 사용 가능한 공간이 있는 경우에만 데이터를 보내고, 수신자는 채널에 사용 가능한 데이터가 있는 경우에만 데이터를 수신합니다. <code>ch )和接收操作(<code>v := )都是阻塞的。这意味着发送方只有在通道中有可用的空间时才会发送数据,而接收方只有在通道中有可用数据时才会接收数据。

实战案例:使用通道在多个 Goroutine 之间传递数据

package main

import "fmt"

func main() {
    // 创建一个带有缓冲区的通道(可以存储最多 10 个值)
    ch := make(chan int, 10)

    // 启动 5 个 Goroutine 向通道发送数据
    for i := 0; i < 5; i++ {
        go func(i int) {
            ch <- i
        }(i)
    }

    // 从通道接收数据并打印结果
    for i := 0; i < 5; i++ {
        fmt.Println(<-ch)
    }
}

互斥锁 (Mutex)

互斥锁是一种低级的同步机制,用于确保同一时间只有一个 Goroutine 可以访问共享资源。sync.Mutex 类型提供了对互斥锁的访问。

实战案例:使用互斥锁保护对共享资源的访问

package main

import (
    "fmt"
    "sync"
)

var (
    mu      sync.Mutex // 定义一个互斥锁
    counter int       // 共享资源
)

func main() {
    for i := 0; i < 100; i++ {
        go func(i int) {
            // 获取互斥锁
            mu.Lock()
            defer mu.Unlock() // 释放互斥锁

            // 访问共享资源
            counter++
            fmt.Printf("Goroutine %d: counter = %d\n", i, counter)
        }(i)
    }
}

等待组 (WaitGroup)

等待组用于跟踪正在等待完成的 Goroutine 的数量。当 Goroutine 完成时,它们调用 Done 方法来减少等待组计数。主 Goroutine可以通过调用 Wait

실용 사례: 채널을 사용하여 여러 Goroutine 간에 데이터 전송

package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup

    // 启动 5 个 Goroutine
    for i := 0; i < 5; i++ {
        wg.Add(1)
        go func(i int) {
            fmt.Printf("Goroutine %d started\n", i)
            defer wg.Done() // Goroutine 完成时调用 Done
        }(i)
    }

    // 等待所有 Goroutine 完成
    wg.Wait()
    fmt.Println("All Goroutines finished")
}

Mutex(Mutex)

Mutex는 동시에 하나의 Goroutine만 처리할 수 있도록 하는 저수준 동기화 메커니즘입니다. 공유 리소스에 액세스 . sync.Mutex 유형은 뮤텍스 잠금에 대한 액세스를 제공합니다.

🎜실용 사례: 공유 리소스에 대한 액세스를 보호하기 위해 뮤텍스 잠금을 사용합니다.🎜🎜rrreee🎜🎜WaitGroup🎜🎜🎜Waiting 그룹은 완료를 기다리는 고루틴 수를 추적하는 데 사용됩니다. Goroutine이 완료되면 Done 메서드를 호출하여 대기 그룹 수를 줄입니다. 기본 고루틴은 Wait 메소드를 호출하여 모든 고루틴이 완료될 때까지 차단할 수 있습니다. 🎜🎜🎜실용 사례: 대기 그룹을 사용하여 모든 고루틴이 완료될 때까지 기다립니다.🎜🎜rrreee🎜🎜동기화 메커니즘을 이해하는 것이 중요합니다.🎜🎜🎜올바른 동기화 메커니즘을 선택하는 것은 동시 환경에서 강력하고 올바른 Go 프로그램을 구축하는 데 중요합니다. 채널, 뮤텍스 및 대기 그룹의 사용을 이해함으로써 함수와 고루틴 간의 조정 및 데이터 일관성을 보장할 수 있습니다. 🎜

위 내용은 golang 함수와 goroutine 간의 동기화 메커니즘의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.