GO · 패턴
워커 큐 패턴
백그라운드 작업 처리를 위한 워커 큐. 작업 제출, 재시도, 동시성 제한을 구현합니다.
패턴고급worker-queuebackground-jobconcurrencypattern
핵심 설명
백그라운드 작업 처리를 위한 워커 큐. 작업 제출, 재시도, 동시성 제한을 구현합니다.
Go code
package main
import (
"context"
"fmt"
"sync"
"time"
)
type Job struct {
ID int
Payload string
}
type WorkerQueue struct {
jobs chan Job
results chan string
wg sync.WaitGroup
}
func NewWorkerQueue(workers, queueSize int) *WorkerQueue {
wq := &WorkerQueue{
jobs: make(chan Job, queueSize),
results: make(chan string, queueSize),
}
for i := 0; i < workers; i++ {
wq.wg.Add(1)
go wq.worker(i)
}
return wq
}
func (wq *WorkerQueue) worker(id int) {
defer wq.wg.Done()
for job := range wq.jobs {
time.Sleep(100 * time.Millisecond)
wq.results <- fmt.Sprintf("워커%d: 작업%d(%s) 완료",
id, job.ID, job.Payload)
}
}
func (wq *WorkerQueue) Submit(ctx context.Context, job Job) error {
select {
case wq.jobs <- job:
return nil
case <-ctx.Done():
return ctx.Err()
}
}
func (wq *WorkerQueue) Close() {
close(wq.jobs)
wq.wg.Wait()
close(wq.results)
}
func main() {
wq := NewWorkerQueue(3, 10)
ctx := context.Background()
for i := 1; i <= 5; i++ {
wq.Submit(ctx, Job{ID: i, Payload: fmt.Sprintf("데이터-%d", i)})
}
go func() { wq.Close() }()
for r := range wq.results { fmt.Println(r) }
}학습 팁
큐 크기(버퍼)를 워커 수의 2-3배로 설정하면 작업 제출과 처리 사이의 속도 차이를 완화합니다.
주의할 점
큐가 가득 차면 Submit이 블로킹됩니다. context로 타임아웃을 설정하여 무한 대기를 방지하세요.
자주 묻는 질문
워커 큐 패턴란 무엇인가요?
백그라운드 작업 처리를 위한 워커 큐. 작업 제출, 재시도, 동시성 제한을 구현합니다.
워커 큐 패턴 학습 시 주의할 점은 무엇인가요?
큐가 가득 차면 Submit 이 블로킹됩니다. context 로 타임아웃을 설정하여 무한 대기를 방지하세요.