2014-02-11 2 views
5

В настоящее время у меня это так, что есть один поток, обрабатывающий цикл accept, один основной поток для выполнения всего логического состояния с учетом состояния, а затем 2 потока для каждого подключенного клиента. Один клиентский поток обрабатывает входной конвейер и использует параллелизм каналов для отправки сообщений в основной логический поток. Другой клиентский поток обрабатывает выходной конвейер, получает сообщения из основного логического потока и отправляет их клиенту.Является ли это разумной архитектурой для многопользовательского сетевого сервера? (Сколько накладных расходов возникает при подключении труб?)

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

Является ли накладными расходами на параллельные параллельные соединения STM/pipe достаточно, чтобы это был разумный подход, когда у меня будет несколько тысяч подключенных клиентов, отправляющих по два или три сообщения в секунду каждый?

ответ

5

Зеленые потоки Haskell достаточно дешевы, чтобы я определенно рекомендовал подход из 2 потоков на одного клиента. Не видя деталей, я не могу комментировать, будет ли STM узким местом или нет, но это будет зависеть от вашей реализации. STM может определенно справиться с этим уровнем рабочей нагрузки, считая, что он используется правильно.

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