Как запрограммировать пул соединений?

Существует ли известный алгоритм для реализации пула соединений? Если нет, то какие известные алгоритмы и каковы их компромиссы?
Какие шаблоны проектирования распространены при проектировании и программировании пула соединений?
Существуют ли примеры кода, реализующие пул соединений с использованием boost.asio?
Это хорошая идея использовать пул соединений для постоянных соединений (а не http)?
Как потоки связаны с пулом соединений? Когда вам нужен новый поток?

Ответы

Ответ 1

Если вы ищете чистую политику объединения потоков (может быть соединение или любой ресурс), существуют два простых подхода: -

  • Half Sync/Half Async Model (обычно с использованием очередей сообщений для передачи информации).

  • Модель лидеров/последователей (обычно используется очередь запросов для передачи информации).

Первый подход выглядит следующим образом: -

  • Вы создаете пул потоков для обрабатывать ресурс. Часто этот размер (количество потоков) должно быть настраивается. Назовите эти темы Рабочие.
  • Затем вы создаете главный поток, который отправит работу на Рабочий. Программа приложения отправляет задачу как сообщение в основной поток.
  • Главный поток помещает то же самое на сообщение Q выбранного Рабочего поток, а поток Рабочий удаляется из бассейн. Выбор и удаление Рабочий поток нуждается в синхронизации.
  • После того, как Рабочий завершает task, он возвращается в пул потоков.

Сам мастер-поток может использовать задачи, которые он получает в FCFS или с приоритетом. Это будет зависеть от вашей реализации.

Вторая модель (Лидер/Последователи) выглядит примерно так: -

  • Создайте пул потоков. Первоначально все Рабочие. Затем выберите Лидер, автоматически отдыхающий - все становятся последователями. Обратите внимание, что выбор a Лидер должен быть синхронизирован.
  • Поместите все данные, которые будут обрабатываться на одиночный запрос Q.
  • Лимит потока Лидер. задание. Затем он сразу же выбирает нового лидера и начинает выполнение задачи.
  • Новый лидер подбирает следующий Задача.

Также могут быть и другие подходы, но изложенные выше простые, которые работают с большинством случаев использования.

Half Sync/Half Async Основная слабость: -

  • Более высокое переключение контекста, синхронизация и копирование данных накладные расходы.

Лидер/Факторы Основной недостаток: -

  • Сложность реализации Лидер в пуле потоков.

Теперь вы можете решить для себя более правильный подход. НТН,