Sobes.tech
Senior

Кандидат менен маек куруп жатканда (эгер сурашса) "Мен ишчилердин белгиленген санын камтыган worker pool колдонмокмун, тапшырмалар үчүн канал жана sync.WaitGroup. Ишчілер суроолорду аткарат, убакыттын өтүшү жана токтотуу контекст аркылуу көзөмөлдөнөт. Натыйжаларды mutex менен корголгон буферге чогултам (же өзүнчө канал аркылуу)." Эми сенин кезиң Бул чатта код жаз. Мен текшерип, кайтарым берем. Эмне менен баштоо керектигин билбесең, кеңеш сура. Ийгилик!

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)

} }