AzLearn

تمرين إعادة البناء

Worker Pool

أعد كتابة برنامج Go يوزع مهاما على workers.

go ~22 دقيقة متوسط
أعد بناء الكود Rebuild

هذا هو الكود. اكتبه بنفسك.

الكود المرجعي
package main

import (
	"fmt"
	"sort"
	"sync"
)

type Job struct {
	ID     int
	Number int
}

type Result struct {
	ID     int
	Square int
}

func worker(jobs <-chan Job, results chan<- Result, wg *sync.WaitGroup) {
	defer wg.Done()
	for job := range jobs {
		results <- Result{ID: job.ID, Square: job.Number * job.Number}
	}
}

func main() {
	jobs := make(chan Job)
	results := make(chan Result)
	var wg sync.WaitGroup

	for i := 0; i < 3; i++ {
		wg.Add(1)
		go worker(jobs, results, &wg)
	}

	go func() {
		for id, number := range []int{2, 4, 6, 8, 10} {
			jobs <- Job{ID: id, Number: number}
		}
		close(jobs)
		wg.Wait()
		close(results)
	}()

	var collected []Result
	for result := range results {
		collected = append(collected, result)
	}
	sort.Slice(collected, func(i, j int) bool {
		return collected[i].ID < collected[j].ID
	})

	for _, result := range collected {
		fmt.Printf("job %d -> %d\n", result.ID, result.Square)
	}
}
اكتب هنا