Введение.
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.