Существует ли известный алгоритм для реализации пула соединений? Если нет, то какие известные алгоритмы и каковы их компромиссы?
Какие шаблоны проектирования распространены при проектировании и программировании пула соединений?
Существуют ли примеры кода, реализующие пул соединений с использованием boost.asio?
Это хорошая идея использовать пул соединений для постоянных соединений (а не http)?
Как потоки связаны с пулом соединений? Когда вам нужен новый поток?
Как запрограммировать пул соединений?
Ответ 1
Если вы ищете чистую политику объединения потоков (может быть соединение или любой ресурс), существуют два простых подхода: -
-
Half Sync/Half Async Model (обычно с использованием очередей сообщений для передачи информации).
-
Модель лидеров/последователей (обычно используется очередь запросов для передачи информации).
Первый подход выглядит следующим образом: -
- Вы создаете пул потоков для обрабатывать ресурс. Часто этот размер (количество потоков) должно быть настраивается. Назовите эти темы Рабочие.
- Затем вы создаете главный поток, который отправит работу на Рабочий. Программа приложения отправляет задачу как сообщение в основной поток.
- Главный поток помещает то же самое на сообщение Q выбранного Рабочего поток, а поток Рабочий удаляется из бассейн. Выбор и удаление Рабочий поток нуждается в синхронизации.
- После того, как Рабочий завершает task, он возвращается в пул потоков.
Сам мастер-поток может использовать задачи, которые он получает в FCFS или с приоритетом. Это будет зависеть от вашей реализации.
Вторая модель (Лидер/Последователи) выглядит примерно так: -
- Создайте пул потоков. Первоначально все Рабочие. Затем выберите Лидер, автоматически отдыхающий - все становятся последователями. Обратите внимание, что выбор a Лидер должен быть синхронизирован.
- Поместите все данные, которые будут обрабатываться на одиночный запрос Q.
- Лимит потока Лидер. задание. Затем он сразу же выбирает нового лидера и начинает выполнение задачи.
- Новый лидер подбирает следующий Задача.
Также могут быть и другие подходы, но изложенные выше простые, которые работают с большинством случаев использования.
Half Sync/Half Async Основная слабость: -
- Более высокое переключение контекста, синхронизация и копирование данных накладные расходы.
Лидер/Факторы Основной недостаток: -
- Сложность реализации Лидер в пуле потоков.
Теперь вы можете решить для себя более правильный подход. НТН,