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