Мне очень жаль, что этот вопрос сидит здесь уже восемь лет, и я считаю несколько довольно плохих ответов, потому что все они игнорируют слона в комнате.
Вы говорите «действительно типично, как наличие потока на клиента», но наличие потока ОС на клиента - это крайне плохой дизайн . Потоки имеют большой вес, занимают много времени на создание и уничтожение и занимают ~ 1 МБ только для стека потоков. Если у вас есть один поток на соединение, то 1000 одновременных клиентских подключений (что вполне возможно) сожгут 1 ГБ ОЗУ только для их стеков, а производительность вашей программы (на любом языке) будет ограничена количеством переключений контекста, необходимых для получения любая работа сделана. Вы не хотите использовать этот дизайн на любом языке, включая C и OCaml. Обратите внимание, что эта проблема особенно остра в контексте отслеживания языков, собираемых мусором, поскольку GC также пересекает все эти потоки, чтобы сопоставлять глобальные корни перед каждым циклом GC. Я первый, кто признает, что этот анти-паттерн вездесущ в реальном мире, но, пожалуйста, не копируйте его! Я видел серверы с низкой задержкой в финансовой отрасли, написанные на C ++ с использованием одного потока на соединение, и они терпели задержки до шести секунд только из-за (Windows) ОС, обслуживающей эти потоки.
См .: http://people.eecs.berkeley.edu/~sangjin/2012/12/21/epoll-vs-kqueue.html
Давайте вместо этого рассмотрим эффективный дизайн, такой как интерфейс epoll или kqueue к ядру ОС, предоставляющий код сервера информацию о буферах входящих и исходящих данных. Однопоточные серверы могут достичь превосходной производительности с такой конструкцией. Тем не менее, типичный сервер выполняет сериализацию для каждого клиента и некоторую базовую работу, которая часто выполняется последовательно для всех клиентских подключений. Следовательно, сериализация и десериализация могут быть распараллелены, но работа главного сервера невозможна. В этом контексте OCaml отлично подходит для всего, кроме уровня сериализации, поскольку он плохо поддерживает параллелизм.
Я лично внедрил множество серверов для различных отраслей промышленности с очень разными требованиями к производительности. По моему опыту, OCaml является одним из лучших инструментов для этого, потому что он предлагает отличные библиотеки (простые в использовании и надежные) и отличную производительность последовательного порта. Единственная проблема, которую я имею, связана с распараллеливанием уровня сериализации, но на практике я обнаружил, что OCaml работает вокруг альтернатив, таких как Java и .NET, даже если они могут распараллелить это. Я обнаружил, что типичные задержки составляли ~ 100 мкс для .NET и 10 мкс для OCaml.
Смотри также: http://prl.ccs.neu.edu/blog/2016/05/24/measuring-gc-latencies-in-haskell-ocaml-racket/