package main import ( "fmt" "sync" "time" ) // Job represents a unit of work type Job struct { ID int Payload string } // Worker processes jobs from a channel func worker(id int, jobs <-chan Job, results chan<- string) { for job := range jobs { fmt.Printf("Worker %d started job %d: %s ", id, job.ID, job.Payload) time.Sleep(time.Second) // Simulate work result := fmt.Sprintf("Job %d completed by worker %d", job.ID, id) fmt.Println(result) results <- result } } func main() { const numJobs = 10 const numWorkers = 3 jobs := make(chan Job, numJobs) results := make(chan string, numJobs) var wg sync.WaitGroup // Start workers for w := 1; w <= numWorkers; w++ { wg.Add(1) go func(workerID int) { defer wg.Done() worker(workerID, jobs, results) }(w) } // Send jobs for j := 1; j <= numJobs; j++ { jobs <- Job{ID: j, Payload: fmt.Sprintf("task-%d", j)} } close(jobs) // Wait for all workers to finish wg.Wait() // Close results channel after all workers are done close(results) // Collect and print results fmt.Println(" --- All Jobs Completed ---") for r := range results { fmt.Println("Collected result:", r) } }