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

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

13
задан rcollyer 13 May 2010 в 12:53
поделиться

1 ответ

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

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

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

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

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

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

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

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

Могут быть и другие подходы, но описанные выше - простые, которые работают в большинстве случаев.

Half Sync/Half Async Основные недостатки:-

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

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

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

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

18
ответ дан 1 December 2019 в 23:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: