PHpullh
학습 라이브러리/Go/워커 큐 패턴

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 로 타임아웃을 설정하여 무한 대기를 방지하세요.

Continue Learning

Go 학습을 이어가세요

총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.