Пул потоків () — у програмуванні це шаблон проєктування програмного забезпечення, призначений для забезпечення паралельного виконання в комп'ютерній програмі.
Його також часто називають моделлю реплікованих робітників () або моделлю бригади робітників (). Пул потоків підтримує множину потоків, які очікують на призначення завдань для їх паралельного виконання під керуванням програми.
Продуктивність Підтримання пулу потоків підвищує продуктивність і усуває затримки виконання, пов'язані з частим створенням і знищенням потоків для короткочасних завдань. Ще однією перевагою є можливість обмеження навантаження на систему, коли використовується менше потоків, ніж доступно. Кількість доступних потоків налаштовується відповідно до обчислювальних ресурсів, доступних програмі, наприклад для паралельного опрацювання черги завдань.
З'єднання сокета з іншим мережевим вузлом, розрив і повторне встановлення якого може потребувати значної кількості тактів процесора, можна підтримувати значно ефективніше, якщо пов'язати його з потоком, що існує протягом виконання не однієї, а кількох мережевих транзакцій.
Існують реалізації пулів потоків, які дають змогу легко ставити завдання в чергу, керувати рівнем паралелізму та синхронізувати потоки на вищому рівні абстракції, ніж це можливо за безпосереднього ручного керування потоками. У таких випадках підвищення продуктивності від використання пулу потоків може бути другорядною перевагою.
Програма, яка використовує два пула потоків для обробки двох типів завдань, може переміщати потік з одного пула до іншого, залежно від заповненості черг цих завдань.
Приклади В 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) Серверна ферма Багатоетапна подійно-орієнтована архітектура
Примітки
Посилання "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