Sobes.tech
Senior

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)
}

}