2013-12-02 4 views
3

Я реализую сервер сокетов. Все клиенты (до 10k) должны оставаться на связи.Сервер многопоточных сокетов с использованием libev

Вот мой текущий дизайн:

  1. Основной поток создает цикл обработки событий (использование Epoll по умолчанию) и Бодрствующего для приема клиентов.
  2. Принимать обратный вызов
    • Принять fd и установить его в неблокирующий режим.
    • Добавить наблюдателя для fd для отслеживания событий чтения.
  3. считанного обратный вызов
    • считывание данные и добавить задачу в пуле потоков для отправки ответа.

Можно ли переместить часть чтения в пуле потоков, или любую другую лучшую идею? Спасибо.

ответ

1

Трудно сказать. Вы не хотите, чтобы потоки 10k выполнялись в фоновом режиме. Вы должны сохранить прочитанную часть в основном потоке. Таким образом, если все клиенты начинают спрашивать о вещах, вы сбиваете эти ресурсы только в очереди threadpool (в то же время вы не запускаете потоки 10k). Также вы можете получить лучшую производительность таким образом, потому что избегаете делать ненужные переключатели контекста (между вашими потоками).

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

 Смежные вопросы

  • Нет связанных вопросов^_^