В качестве побочного проекта я сейчас пишу сервер для старой игры, в которую играл раньше. Я пытаюсь сделать сервер как можно более слабосвязанным, но мне интересно, что было бы хорошим дизайнерским решением для многопоточности. На данный момент у меня следующая последовательность действий:
- Запуск (создание) ->
- Сервер (слушает клиентов, создает) ->
- Клиент (слушает команды и отправляет данные периода)
Я предполагаю, что в среднем 100 клиентов, так как это был максимум в любой момент времени для игры. Каково было бы правильное решение относительно потока всего этого? Моя текущая настройка выглядит следующим образом:
- 1 поток на сервере, который прослушивает новые подключения, при новом подключении создайте объект клиента и снова начните прослушивание.
- Клиентский объект имеет один поток, прослушивающий входящие команды и отправляющий периодические данные. Это делается с помощью неблокирующего сокета, поэтому он просто проверяет, есть ли доступные данные, обрабатывает их и затем отправляет сообщения, которые он поставил в очередь. Вход в систему выполняется до начала цикла отправки-получения.
- Один поток (пока) для самой игры, поскольку я считаю, что он отделен от всей клиент-серверной части, если говорить архитектурно.
Это приведет к 102 потокам. Я даже рассматриваю возможность предоставления клиенту 2 потоков, один для отправки и один для получения. Если я сделаю это, я могу использовать блокирующий ввод / вывод в потоке получателя, что означает, что поток будет в основном бездействовать в средней ситуации.
Моя главная проблема заключается в том, что, используя такое количество потоков, я собираю ресурсы. Меня не волнуют условия гонки или тупики, так как с этим мне все равно придется иметь дело.
Мой дизайн настроен таким образом, чтобы я мог использовать один поток для всех клиентских коммуникаций, независимо от того, равен он 1 или 100. Я отделил логику связи от самого объекта клиента, чтобы я мог реализовать его без необходимости переписывать много кода.
Основной вопрос: неправильно ли использовать более 200 потоков в приложении? Есть ли у него преимущества? Я подумываю о том, чтобы запустить это на многоядерной машине, неужели много преимуществ таких ядер, как это?
Спасибо!
Из всех этих тем большинство из них обычно блокируются. Я не ожидаю соединения более 5 в минуту. Команды от клиента будут приходить редко, я бы сказал, в среднем 20 в минуту.
Исходя из ответов, которые я здесь получаю (переключение контекста стало хитом производительности, о котором я думал, но я не знал этого, пока вы не указали на это, спасибо!) Думаю, я пойду на подход с слушатель, один получатель, один отправитель и некоторые другие вещи; -)