boost asio: другой пул потоков для разных задач

В сети есть много примеров создания простого пула потоков, таких как Sample1 а также Sample2

Однако я хотел реализовать отдельный пул потоков для разных задач. Например, приложение может иметь пул потоков для обработки входящих tcp-соединений (назовем это сетевым пулом), а другой пул для связи с базой данных (пул баз данных).

Эти входящие tcp-запросы могут требовать информацию из базы данных. В этом случае потребуется запросить эти потоки из пула базы данных для выполнения запроса и вернуть результат асинхронно.

Есть ли рекомендуемый способ сделать это с помощью boost :: asio? Будет ли это иметь один экземпляр io_service для каждого пула? И как эти потоки должны общаться друг с другом (используя boost)?

Я понимаю, что для объяснения всего этого код не будет таким коротким и тривиальным, но, если возможно, некоторый псевдокод будет высоко цениться.

Спасибо!

5

Решение

Связь между потоками / пулами потоков должна осуществляться через потокобезопасные очереди.

В вашем примере у вас должен быть пул сетевых потоков для обработки сетевых подключений, пул процессов для выполнения сетевых запросов и пул соединений с базами данных / пул потоков (один пул на базу данных; один поток на соединение с базой данных, но, возможно, у вас может быть несколько подключения к той же базе данных).

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

Скажем, у вас есть сетевой запрос, который должен получить информацию из базы данных. Вы получите запрос при выполнении в сетевом потоке и добавите обработчик запроса в очередь процесса.

Обработчик процесса (в потоке процесса) увидит, что запросу требуется что-то из базы данных, и поэтому он добавит запрос базы данных, а также обработчик обратного вызова в соответствующую очередь базы данных.

Соответствующий поток базы данных получит запрос из очереди базы данных, выполнит запрос, вернет результаты и добавит результаты в обработчик обратного вызова. Объект обработчика обратного вызова с результатами базы данных будет затем помещен в очередь процесса.

Обработчик обратного вызова (в потоке процесса) затем продолжит выполнение запроса и, возможно, упакует ответное сообщение, которое затем помещается в сетевую очередь.

Сетевой обработчик (в сетевом потоке) будет тогда получать ответное сообщение и доставлять его (при необходимости кодируя).

Пример потокобезопасной очереди можно найти Вот.

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

Мой пример использует boost для asio (см. Реализация TCP-соединения в той же системе), но он не использует boost io_service для обработчиков.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]