Может ли OCaml писать сетевые серверы?

Мне было интересно, будет ли OCaml хорошо работать с точки зрения производительности и простоты реализации при работе с типичными взаимодействиями клиент/сервер через TCP в многопоточной среде. Я имею в виду что-то действительно типичное, например, наличие потока на клиента, который получает данные, управляемые изменения в состояниях игры и отправка их обратно клиентам.

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

Заранее спасибо

Ответ 1

Производительность:, вероятно, нет. Нити OCaml не обеспечивают параллельное выполнение, это всего лишь способ структурирования вашей программы. Сама среда OCaml не является потокобезопасной, поэтому единственный код, который может выполняться параллельно одному потоку OCaml, будет сопряжен с C-кодом (без обратных вызовов в OCaml!).

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

Простота реализации: он не будет меняться в мире. У вас будет комфорт OCaml и библиотека, похожая на pthread. Если вы ищете новые возможности для поиска, используя то, что вы узнали о OCaml, я рекомендую Jocaml. Он идет и не синхронизируется с OCaml, но была повторная реализация (совсем недавно), и даже когда она немного не синхронизирована, это очень весело и совершенно новая перспектива параллельных программ.

Jocaml реализован поверх OCaml. Что, когда время выполнения не является одновременно и все, я почти уверен, что он использует отдельные процессы и передачу сообщений. Но для приложения, которое вы упомянули, оно должно быть в порядке.

Ответ 2

OCaml вполне подходит для написания сетевых серверов, хотя, как отмечает Паскаль, существуют ограничения на потоки.

К счастью, однако, потоки - это не единственный способ организовать такую ​​программу. Библиотека Lwt (для потоков с низким весом) обеспечивает абстракцию асинхронного ввода-вывода, который довольно прост в использовании (особенно в сочетании с бит поддержки синтаксиса). Все работает в одном потоке, но все это связано с асинхронным циклом ввода-вывода (построенным на вызове Unix select), а стиль программирования позволяет писать код, который выглядит как прямой код (избегая значительной части служебных данных обычного кода выполнения асинхронного ввода-вывода на многих других языках). Например:

lwt my_message = read_message socket in
let repsonse = compute_response my_message in
send_response socket response

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

Ответ 3

OCaml отлично подойдет для сетевых приложений, если вы можете жить с относительно небольшим количеством потоков, активных за один раз, скажем, не более 100. В качестве примера можно привести MLdonkey, хотя в клиентском пространстве, а не в пространство сервера.

Ответ 4

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