Mülakatçıya ne söyleyebilirsiniz (sorarlarsa) "Fiks bir işçi sayısına sahip worker havuzu, görevler için bir kanal ve sync.WaitGroup kullanırdım. İşçiler istekleri yapacak, zaman aşımı ve iptal ise bağlam aracılığıyla kontrol edilecek. Sonuçları, bir mutex ile korunan bir tamponda toplayacağım (veya ayrı bir kanal aracılığıyla)." Şimdi sıra sende Bu sohbette kodu yaz. Kontrol edeceğim ve geri bildirimde bulunacağım. Nereden başlayacağınızı bilmiyorsanız, ipucu isteyin. İyi şanslar!
sobes.tech yapay zeka
AI'dan gelen yanıt
go package main
import ( "context" "fmt" "sync" "time" )
// Task, bir işleme görevi temsil eder type Task struct { id int // diğer alanlar }
// WorkerPool, işçilerin havuzunu uygular func WorkerPool(ctx context.Context, tasks <-chan Task, results chan<- string, wg *sync.WaitGroup) { defer wg.Done() for { select { case <-ctx.Done(): return case task, ok := <-tasks: if !ok { return } // Görevi işle res := processTask(task) select { case results <- res: case <-ctx.Done(): return } } } }
func processTask(t Task) string { // çalışma simülasyonu time.Sleep(100 * time.Millisecond) return fmt.Sprintf("sonuç for task %d", t.id) }
func main() { tasks := make(chan Task) results := make(chan string) var wg sync.WaitGroup
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()
workerCount := 5
wg.Add(workerCount)
for i := 0; i < workerCount; i++ {
go WorkerPool(ctx, tasks, results, &wg)
}
// Ayrı bir goroutine, işçiler tamamlandıktan sonra sonuç kanalını kapatır
go func() {
wg.Wait()
close(results)
}()
// Görevleri gönder
go func() {
for i := 0; i < 20; i++ {
tasks <- Task{id: i}
}
close(tasks)
}()
// Sonuçları topla
for res := range results {
fmt.Println(res)
}
}