Sobes.tech
Senior

რა უნდა უთხრას ინტერვიუერს (თუ სთხოვენ) "მე გამოვიყენებ worker pool-ს, სადაც მუშაკთა რაოდენობა ფიქსირებულია, დავალებებისთვის არის არხი და sync.WaitGroup. მუშაკები შეასრულებენ მოთხოვნებს, ხოლო დროის გასვლის და გაუქმების კონტროლი კონტექსტის მეშვეობით მოხდება. შედეგებს შევაგროვებ მუტექსით დაცულ ბუფერში (ან ცალკე არხით)." ახლა შენი რიგია ამ საუბარში დაწერე კოდი. მე შემოვამოწმებ და გეტყვი რეაგირებას. თუ არ იცი საიდან დაიწყო, სთხოვ რჩევას. წარმატებები!

sobes.tech AI

პასუხი AI-სგან

go package main

import ( "context" "fmt" "sync" "time" )

// Task, işlənmək üçün bir vəzifəni təmsil edir type Task struct { id int // digər sahələr }

// WorkerPool, işçilərin hovuzunu həyata keçirir 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 } // Vəzifənin işlənməsi res := processTask(task) select { case results <- res: case <-ctx.Done(): return } } } }

func processTask(t Task) string { // işin simulasyonu time.Sleep(100 * time.Millisecond) return fmt.Sprintf("nəticə üçün vəzifə %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)
}

// İşçilər tamamlandıqdan sonra nəticə kanalını bağlamaq üçün ayrıca goroutine
go func() {
	wg.Wait()
	close(results)
}()

// Vəzifələri göndəririk
go func() {
	for i := 0; i < 20; i++ {
		tasks <- Task{id: i}
	}
	close(tasks)
}()

// Nəticələri toplayırıq
for res := range results {
	fmt.Println(res)

} }