YaChudo

Пул потоків

Переглядів: 0. Оновлено 25.10.2026.

Приклад пулу потоків (зелені блоки) із завданнями, що очікують на виконання (сині), та завершеними завданнями (жовті)

Пул потоків (англ. thread pool) — у програмуванні це шаблон проєктування програмного забезпечення, призначений для забезпечення паралельного виконання в комп'ютерній програмі.

Його також часто називають моделлю реплікованих робітників (англ. replicated workers) або моделлю бригади робітників (англ. worker-crew model).[1] Пул потоків підтримує множину потоків, які очікують на призначення завдань для їх паралельного виконання під керуванням програми.

Продуктивність

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

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

Існують реалізації пулів потоків, які дають змогу легко ставити завдання в чергу, керувати рівнем паралелізму та синхронізувати потоки на вищому рівні абстракції, ніж це можливо за безпосереднього ручного керування потоками.[3][4] У таких випадках підвищення продуктивності від використання пулу потоків може бути другорядною перевагою.

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

Приклади

В bash з використанням --max-procs / -P в xargs:

echo {1..5} | xargs -P 5 -n 1 sleep 2

В Go, виклик пулу робочих потоків:

package main

import (
    "fmt"
    "time"
)

func worker(id int, jobs <-chan int, results chan<- int) {
    for j := range jobs {
        fmt.Println("worker", id, "started  job", j)
        time.Sleep(time.Second)
        fmt.Println("worker", id, "finished job", j)
        results <- j * 2
    }
}

func main() {
    const numJobs = 5
    jobs := make(chan int, numJobs)
    results := make(chan int, numJobs)

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

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

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

Див. також

Примітки

  1. ↑ Yibei Ling; Tracy Mullen; Xiaola Lin (Квітень 2000). Analysis of optimal thread pool size. ACM SIGOPS Operating Systems Review. 34 (2): 42—55. doi:10.1145/346152.346320. S2CID 14048829.
  2. ↑ Holub, Allen (2000). Taming Java Threads. Apress. с. 209.
  3. ↑ QThreadPool Class | Qt Core 5.13.1.
  4. ↑ GitHub - vit-vit/CTPL: Modern and efficient C++ Thread Pool Library. GitHub. 24 вересня 2019.

Посилання

Джерело: стаття у Вікіпедії та історія редагувань (автори).