Go за Прикладом: Worker Pools

Work in Progress / Сайт в процесі розробки

У цьому прикладі ми розглянемо як реалізовувати пул робітників використовуючи горутини та канали.

package main
import "fmt"
import "time"

Ось приклад, робітника якого ми будемо використовувати щоб запустити кілька різних екземплярів. Ці робітники будуть отримувати роботу на каналі jobs та надсилати сповіщення про завершення роботи до каналу results. Роботою нашого “працівника” буде сон довжиною в секунду (така собі симуляція реальної роботи).

func worker(id int, jobs <-chan int, results chan<- int) {
    for j := range jobs {
        fmt.Println("працівник", id,
            "почав проботу над завданням", j)
        time.Sleep(time.Second)
        fmt.Println("працівник", id,
            "закінчив роботу над завданням", j)
        results <- j * 2
    }
}
func main() {

Щоб використовувати “пул працівників” нам необхідно створити два канали: один з яких буде передавати завдання робітнику, а інший отримавути результати роботи.

    jobs := make(chan int, 100)
    results := make(chan int, 100)

Запускаємо трох працівників, але спочатку вони блокуються тому що жодної роботи для них ще немає.

    for w := 1; w <= 3; w++ {
        go worker(w, jobs, results)
    }

Надсилаємо 5 завдань о каналу роботи, після чого закриваємо канал для індикації що це вся робота що наразі доступна.

    for j := 1; j <= 5; j++ {
        jobs <- j
    }
    close(jobs)

Нарешті підбираємо результати роботи наших прцівників.

    for a := 1; a <= 5; a++ {
        <-results
    }
}

Наша программа показує 5 завдань що виконуються різними працівниками. Программа працює лише близько 2 секунд, не зважаючи на роботу розраховану вцілому на 5 секунд і все це завдяки 3 працівникам що працюються одночасно.

$ time go run worker-pools.go
працівник 3 почав працювати над завданням 1
працівник 1 почав працювати над завданням 2
працівник 2 почав працювати над завданням 3
працівник 2 закінчив працювати над завданням 3
працівник 2 почав працювати над завданням 4
працівник 3 закінчив працювати над завданням 1
працівник 3 почав працювати над завданням 5
працівник 1 закінчив працювати над завданням 2
працівник 2 закінчив працювати над завданням 4
працівник 3 закінчив працювати над завданням 5
real	0m2.322s
user	0m0.231s
sys	0m0.290s

Наступний приклад: Обмеження Частоти Запитів.