Как запрограммировать пул соединений? - PullRequest
13 голосов
/ 07 мая 2010

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

1 Ответ

18 голосов
/ 07 мая 2010

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

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

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

Первый подход выглядит так: -

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

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

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

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

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

Половинная / полусинхронная слабость: -

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

Лидер / Слабость майора Слабость: -

  • Реализация сложность из Leader выборы в пуле потоков.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...