package main import ( "fmt" "sync" "time" ) type Job struct { ID int Payload string } type Result struct { JobID int ProcessedBy string Status string } // worker function that processes jobs from a channel func worker(id int, jobs <-chan Job, results chan<- Result) { for job := range jobs { fmt.Printf("Worker %d started processing job %d ", id, job.ID) time.Sleep(time.Millisecond * 500) // Simulate work results <- Result{JobID: job.ID, ProcessedBy: fmt.Sprintf("Worker %d", id), Status: "Completed"} fmt.Printf("Worker %d finished job %d ", id, job.ID) } } func main() { const numJobs = 9 const numWorkers = 3 jobs := make(chan Job, numJobs) results := make(chan Result, numJobs) var wg sync.WaitGroup // Start workers for w := 1; w <= numWorkers; w++ { wg.Add(1) go func(wID int) { defer wg.Done() worker(wID, jobs, results) }(w) } // Send jobs for j := 1; j <= numJobs; j++ { jobs <- Job{ID: j, Payload: fmt.Sprintf("Task-%d", j)} } close(jobs) // Close jobs channel to signal no more jobs wg.Wait() // Wait for all workers to finish processing jobs close(results) // Close results channel after all workers are done // Collect and print results fmt.Println(" --- Results ---") for res := range results { fmt.Printf("Job %d: %s by %s ", res.JobID, res.Status, res.ProcessedBy) } }