Пул потоків

Пул потоків (англ. 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
}
}
Див. також
- Асинхронність (програмування)
- Пул об'єктів (шаблон проєктування)
- Parallel Extensions (.NET)
- Серверна ферма
- Багатоетапна подійно-орієнтована архітектура
Примітки
- ↑ 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.
- ↑ Holub, Allen (2000). Taming Java Threads. Apress. с. 209.
- ↑ QThreadPool Class | Qt Core 5.13.1.
- ↑ GitHub - vit-vit/CTPL: Modern and efficient C++ Thread Pool Library. GitHub. 24 вересня 2019.
Посилання
- "Query by Slice, Parallel Execute, and Join: A Thread Pool Pattern in Java" by Binildas C. A.
- "Thread pools and work queues" by Brian Goetz
- "Work Queue" by Uri Twig: C++ code demonstration of pooled threads executing a work queue.
- "Windows Thread Pooling and Execution Chaining"
- "Smart Thread Pool" by Ami Bar
- "Programming the Thread Pool in the .NET Framework" by David Carmona
- "Practical Threaded Programming with Python: Thread Pools and Queues" by Noah Gift
- "Optimizing Thread-Pool Strategies for Real-Time CORBA" by Irfan Pyarali, Marina Spivak, Douglas C. Schmidt and Ron Cytron
- "Deferred cancellation. A behavioral pattern" by Philipp Bachmann
- "A C++17 Thread Pool for High-Performance Scientific Computing" by Barak Shoshany
Джерело: стаття у Вікіпедії та історія редагувань (автори).