Що таке пул потоків?


62

Як би реалізувати нитку? Я читав у wikipedia про "streampool", але все ще не можу зрозуміти, що слід зробити для вирішення цього питання (можливо, тому, що я не зовсім зрозумів, що таке "streampool").

Чи може хтось пояснити мені простою англійською мовою, що таке нитка і як можна відповісти на це питання?

Відповіді:


96

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

Реалізація залежить від середовища, але спрощеними термінами вам потрібно:

  • Спосіб створення ниток та утримання їх у режимі очікування. Це може бути досягнуто, якщо кожен потік зачекає біля бар'єру, поки пул не працює. (Це можна зробити і з мютексами.)
  • Контейнер для зберігання створених ниток, таких як черга або будь-яка інша структура, яка має можливість додати нитку до пулу та витягнути її.
  • Стандартний інтерфейс або абстрактний клас для потоків, які використовуються при виконанні роботи. Це може бути абстрактний клас , званий Taskз execute()методом , який виконує роботу , а потім повертається.

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

Коли пул вручається a Task, він бере нитку з контейнера (або чекає, коли один стане доступним, якщо контейнер порожній), передає його Taskі відповідає бар'єру. Це призводить до того, що холостий потік відновить виконання, посилаючись на execute()метод, який Taskвін був наданий. Після завершення виконання потік повертається до пулу, який потрібно поставити в контейнер для повторного використання, а потім відповідає своєму бар'єру, укладаючи спати, поки цикл не повториться.


19
Пул потоків - це група заздалегідь створених, непрацюючих ниток, які готові до роботи. [...] Це запобігає виникненню витрат на створення потоку велику кількість разів. - це повинно бути
напльовано

Чи створює пуловий потік ниток внутрішній бар'єр? Чи можете ви поділитися посиланням у цих рядках?
overrexchange

@overexchange Ні, це не так. Моє посилання на це питання було прикладом кращого способу переписати своє бар’єрне запитання . (Якщо ви це зробите, я напишу відповідь.)
Blrfl

одна з найкращих коротких відповідей.
Blood-HaZaRd

10

Пул потоків - це сукупність керованих потоків, зазвичай організованих у чергу, які виконують завдання в черзі завдань.

Створення нового об'єкта потоку кожного разу, коли вам потрібно щось виконати асинхронно, є дорогим. У пулі потоків ви просто додасте завдання, які ви хочете виконати асинхронно до черги завдань, і пул потоків піклується про призначення доступного потоку, якщо такий є, для відповідного завдання. Як тільки завдання буде виконано, тепер доступний потік запитує інше завдання (якщо вважати, що його залишилося).

Пул ниток допомагає вам уникнути створення або руйнування більшої кількості ниток, ніж справді було б потрібно.

Я б почав із створення класу з чергою ниток та чергою завдань. Потім реалізуйте метод, який додає завдання до черги завдань і перейдіть звідти. Очевидно, ви також повинні дати можливість встановити максимально дозволені нитки в пулі потоків.


1

У багатопотоковому застосуванні пул потоків - це "пул доступних потоків", який може використовуватися вашою програмою. Зазвичай, наприклад .NET. Це все управляється, тому ви просто призначаєте завдання, і як тільки нитка буде вільною, вона збирається виконувати її. Тому для реалізації потокової нитки я б розраховував створити концепцію, коли завдання автоматично приймаються вільними потоками без явного створення потоку для кожного завдання.


1

Приклад реального життя;

  1. Заклад: Операційна система
  2. Розділи: Програми
  3. Люди: Нитки

У вас є заклад, де працюють 12 людей. У цьому закладі є 3 секції. Кухня, туалети та охорона. Якщо ви не використовуєте техніку пулу з нитками, ось так це працює: Усі 12 людей будуть стояти в залі для нарад, якщо нові клієнти приїжджатимуть за бажанням і запитуватимуть завдання, то ви розділите людей по групах і відправте їх виконати свою роботу , і поверніться до зали засідань. Але, перш ніж перейти до виконання своїх обов'язків, проходить підготовчий етап. Їм потрібно надіти правильну форму, обладнати певні пристрої і піти до цього розділу, закінчити роботу та повернутися. Отже, раз у раз, коли вони закінчують свою роботу (кінчики ниток), їм потрібно повертатися до зали засідань, роздягати обмундирування, виймати обладнання та чекати наступної роботи. Вони стосуються створення контексту потоку, його розподілу пам'яті та відстеження інформації ОС.

Якщо ви використовуєте об'єднання ниток, то рано вранці ви призначите 6 людей на кухню, 2 людини для туалету та 4 людини для безпеки. Отже, вони будуть робити свою підготовку лише раз на день. Навіть якщо на кухні немає клієнтів, ці 4 людини будуть там, простоюючи, для будь-яких майбутніх завдань. Їм не потрібно повертатися в зал для нарад, поки кухня не закриється (додаток закінчується). Ці 4 людини знаходяться у басейні додатків Кухня та готові швидко обслуговуватись. Але не можна пообіцяти, що вони працюють цілий день, оскільки кухня може час від часу простоювати. Ця ж логіка застосовується і для туалетів та безпеки.

У першому сценарії ви не витрачаєте жодної нитки на будь-яке завдання, Але потрібно буде багато часу, щоб підготувати кожну нитку до кожного завдання. По-друге, ви готуєте теми заздалегідь, тому ви не можете гарантувати, що ви будете використовувати всі потоки для всіх завдань, але ОС в основному робить велику оптимізацію на ній, тому ви можете сміливо покладатися на неї.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.