Демистификация GoLang WaitGroup с помощью очередей: методы и примеры

Введение.
GoLang предоставляет мощные примитивы параллелизма, включая WaitGroup и каналы, для эффективного управления горутинами. В этой статье мы рассмотрим различные методы использования WaitGroup с очередью для организации параллельных задач.

Метод 1: использование буферизованного канала

package main
import (
    "fmt"
    "sync"
)
func main() {
    taskQueue := make(chan int, 10) // Buffered channel with a capacity of 10
    var wg sync.WaitGroup
    // Producer: Enqueue tasks
    for i := 0; i < 10; i++ {
        taskQueue <- i
    }
// Consumer: Process tasks concurrently
    for i := 0; i < 5; i++ {
        wg.Add(1)
        go func() {
            for task := range taskQueue {
                processTask(task)
            }
            wg.Done()
        }()
    }
// Wait for all goroutines to finish
    wg.Wait()
    close(taskQueue)
}
func processTask(task int) {
    fmt.Println("Processing task:", task)
}

Метод 2. Использование счетчика группы ожидания

package main
import (
    "fmt"
    "sync"
    "time"
)
func main() {
    taskQueue := make([]int, 10) // Slice to store tasks
    var wg sync.WaitGroup
    // Producer: Enqueue tasks
    for i := 0; i < 10; i++ {
        taskQueue[i] = i
    }
// Consumer: Process tasks concurrently
    for i := 0; i < 5; i++ {
        wg.Add(1)
        go func() {
            for {
                task, ok := dequeueTask(&taskQueue)
                if !ok {
                    break // No more tasks, exit the goroutine
                }
                processTask(task)
            }
            wg.Done()
        }()
    }
// Wait for all goroutines to finish
    wg.Wait()
}
func dequeueTask(queue *[]int) (int, bool) {
    if len(*queue) == 0 {
        return 0, false // No more tasks in the queue
    }
    task := (*queue)[0]
    *queue = (*queue)[1:]
    return task, true
}
func processTask(task int) {
    fmt.Println("Processing task:", task)
    time.Sleep(time.Second) // Simulating task processing time
}

Заключение.
В этой статье мы исследовали два метода использования WaitGroup с очередью для организации параллельных задач в GoLang. В первом методе использовался буферизованный канал, а во втором — счетчик группы ожидания с очередью задач. Эти методы предоставляют эффективные способы управления параллельными задачами и гарантируют их завершение, прежде чем продолжить.

Не забудьте импортировать необходимые пакеты, синхронизировать их с WaitGroup и fmt для печати. Поэкспериментируйте с этими методами, чтобы использовать возможности параллелизма в своих приложениях GoLang.